Pendugaan Parameter, Diagnostik Model, dan Peramalan

Angga Fathan Rofiqy

25 October, 2023

Kode di Hide dalam default, untuk menampilkan kode, klik Code .

#                      -=( Install & Load Package Function )=-
install_load <- function (package1, ...)  {   

   # convert arguments to vector
   packages <- c(package1, ...)

   # start loop to determine if each package is installed
   for(package in packages){

       # if package is installed locally, load
       if(package %in% rownames(installed.packages()))
          do.call('library', list(package))

       # if package is not installed locally, download, then load
       else {
          install.packages(package)
          do.call("library", list(package))
       }
   } 
}
path <- function(){
  gsub  ( "\\\\",  "/",  readClipboard ()  )
}
#Copy path, Panggil function di console
#Copy r path, paste ke var yang diinginkan
#Export chart
export.chart <- "C:/Users/Fathan/Documents/Obsidian Vault/2. Kuliah/Smt 5/6. Metode Peramalan Deret Waktu/@Proj/STA1341-MPDW/Pertemuan 8/Chart"

1 Pendahuluan

Dataset yang saya gunakan merupakan koleksi data harga saham historis periode Juli 2018 hingga Juli 2023 dari tujuh raksasa teknologi paling berpengaruh di dunia: Microsoft, Apple, Amazon, Nvidia, Google, Netflix, dan Meta (sebelumnya dikenal sebagai Facebook). Dataset ini menjadi sumber daya berharga bagi analis keuangan, ilmuwan data, dan penggemar pasar saham yang ingin menganalisis dan memahami tren harga perusahaan-perusahaan terkemuka di industri ini.

Dataset ini memilki data :

  1. Open: yakni Harga saham pada awal periode perdagangan tertentu. Ini adalah harga saham pertama pada hari perdagangan tersebut.
  2. High: Harga tertinggi yang saham capai selama periode perdagangan tersebut. Ini mencerminkan harga tertinggi yang pembeli bersedia bayar selama hari tersebut.
  3. Low: Harga terendah yang saham capai selama periode perdagangan tersebut. Ini mencerminkan harga terendah yang penjual bersedia terima selama hari tersebut.
  4. Close: Harga saham pada akhir periode perdagangan tertentu. Ini adalah harga saham terakhir pada hari perdagangan tersebut.
  5. Adj Close (Adjusted Close): Harga penutup yang telah disesuaikan untuk memperhitungkan perubahan seperti pembagian saham atau dividen. Ini adalah harga penutup yang paling relevan untuk analisis jangka panjang, karena mencerminkan harga saham yang sebenarnya setelah penyesuaian.
  6. Volume: Volume perdagangan saham selama periode tertentu. Ini mencerminkan jumlah saham yang diperdagangkan selama hari perdagangan tersebut.

Kami akan menggunakan peubah Adj Close (Adjusted Close), Karena sesuai dengan penjelasan diatas, peubah Adj Close adalah yang paling sesuai untuk dianalisis dibandingkan peubah lainnya.

1.1 Tujuan

Tujuan dari praktikum ini adalah untuk menganalisis pola perkiraan pergerakan harga tujuh saham teknologi terkemuka dengan harapan dapat memberikan rekomendasi kepada pembaca mengenai saham mana yang sebaiknya dipertimbangkan untuk dibeli atau diinvestasikan secara signifikan di antara tujuh perusahaan teknologi besar tersebut.

1.2 Data Preparation

1.2.1 Import Data

install_load('rio')
raw.data <- import("https://raw.githubusercontent.com/Zen-Rofiqy/STA1341-MPDW/main/Data/MAANG%20Stock%20Prices.csv")

1.2.2 Data Checking

Cek Tipe data.

str(raw.data)
## 'data.frame':    8812 obs. of  8 variables:
##  $ Name     : chr  "AMZN" "AMZN" "AMZN" "AMZN" ...
##  $ Date     : chr  "7/30/18" "7/31/18" "8/1/18" "8/2/18" ...
##  $ Open     : chr  "91.366501" "89.324501" "89.199997" "89.438499" ...
##  $ High     : chr  "91.474998" "90.091499" "89.921997" "91.828003" ...
##  $ Low      : chr  "88.301003" "86.966003" "88.801003" "89.300003" ...
##  $ Close    : chr  "88.960999" "88.872002" "89.858498" "91.716499" ...
##  $ Adj Close: chr  "88.960999" "88.872002" "89.858498" "91.716499" ...
##  $ Volume   : chr  "131246000" "114774000" "83062000" "87094000" ...

Semua data Karakter, harus diubah.

Cek Data kosong.

sum(is.na(raw.data))
## [1] 0

Tidak ada data kosong.

1.2.3 Penyesuaian Tipe Data

Semua tipe data masih berupa character. Harus diubah menjadi tipe data yang sesuai.

install_load('dplyr')
data <- raw.data %>%  
  mutate(
    Date = as.Date(raw.data[, 2], format = "%m/%d/%y"), #Mengubah menjadi Date 
    across(3:ncol(raw.data), as.numeric)                #Mengubah menjadi Numerik
  )
str(data)
## 'data.frame':    8812 obs. of  8 variables:
##  $ Name     : chr  "AMZN" "AMZN" "AMZN" "AMZN" ...
##  $ Date     : Date, format: "2018-07-30" "2018-07-31" ...
##  $ Open     : num  91.4 89.3 89.2 89.4 91.9 ...
##  $ High     : num  91.5 90.1 89.9 91.8 92.1 ...
##  $ Low      : num  88.3 87 88.8 89.3 91.1 ...
##  $ Close    : num  89 88.9 89.9 91.7 91.2 ...
##  $ Adj Close: num  89 88.9 89.9 91.7 91.2 ...
##  $ Volume   : num  1.31e+08 1.15e+08 8.31e+07 8.71e+07 6.92e+07 ...

1.2.4 Rechecking Data 

Cek kembali data kosong.

cat('Banyaknya Data Kosong', sum(is.na(data)))
## Banyaknya Data Kosong 42

Melihat baris, kolom mana data yang kosong.

# Mencari indeks baris dan kolom yang mengandung NA
na.idx <- which(is.na(data), arr.ind = TRUE)

# Menampilkan data raw dengan baris dan kolom yang mengandung NA
install_load('DT')
datatable(raw.data[                        # Subsetting
                unique(na.idx[, 1]),   # Vektor indeks baris yang mengandung NA
                unique(na.idx[, 2])  ] # Vektor indeks kolom yang mengandung NA
          )  

Ternyata pada baris tersebut ada data karakter text yang merupakan label dari tiap kolomnya. Sehingga ketika diubah ke numerik akan menjadi NA. Maka saya akan menghapus baris tersebut.

1.2.5 Data Cleaned

data <- data %>%
  filter(!row_number() %in% unique(na.idx[, 1]))
datatable(data, filter = 'top', 
          options = list(pageLength = 5))

1.3 Eksplorasi Data

install_load('ggplot2','extrafont')
# font_import(); loadfonts() #Run ini sekali aja
theme.ts <- list(
  theme(legend.position = "none",
        axis.text.x = element_text(hjust = 1, 
                                   margin = margin(b = 10, t=20)),
        axis.text.y = element_text(vjust = 0.5, face = "bold", 
                                   margin = margin(l = 20, r = 20)),
        plot.title = element_text(hjust = 0.5, face = "bold"),
        text = element_text(size = 30),
        plot.subtitle = element_text(hjust = 0.5),
        panel.background = element_rect(fill = 'transparent'),
        plot.background = element_rect(fill='transparent', color=NA),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        axis.line = element_line(linewidth = 1, colour = "black"))
        )
theme.ts1 <- list(
  theme(legend.position = "none",
        axis.text.x = element_text(hjust = 1, 
                                   margin = margin(b = 10, t=20)),
        axis.text.y = element_text(vjust = 0.5, face = "bold", 
                                   margin = margin(l = 50, r = 20)),
        plot.title = element_text(hjust = 0.5, face = "bold"),
        text = element_text(size = 30),
        plot.subtitle = element_text(hjust = 0.5),
        panel.background = element_rect(fill = 'transparent'),
        plot.background = element_rect(fill='transparent', color=NA),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        axis.line = element_line(linewidth = 1, colour = "black"))
        )

1.3.1 Time Series MAANG

Melihat keseluruhan Time Series data saham.

install_load('viridis','ggrepel')
#Plot
chart <-
ggplot(data, aes(x=Date, y=`Adj Close`, color=Name, alpha=Name)) + #Data
  geom_line(aes(color=Name), linewidth=1.5) + #Timeseries
  #Color
  scale_color_manual(values = c(NVDA="green4", NFLX="firebrick3", 
                                MSFT="deepskyblue2", META="dodgerblue3", 
                                AAPL="lightskyblue4",
                                GOOG="gold3", AMZN="orange2") ) +
  scale_alpha_manual(values = c("NVDA" = .25, "NFLX" = .25, "MSFT" = .25, 
                                "META" = .25, "AAPL" = .25, "GOOG" = .25, 
                                "AMZN" = 1)) +
  theme.ts + #THeme
  labs(x = "\nPeriode (Tahun)", y='Harga Saham (USD)',
       title = "Time Series MAANG",
       subtitle = "Seperti apa sih pola deret waktu saham MAANG?\n") +
  # Label / legend
  geom_text_repel(
    data=data[data$Date == max(data$Date),], #Posisi di ujung data
    aes(color = Name, label = Name), #Warna garis & label saham
    size = 8, #Ukuran text
    nudge_x = 80, #Posisi Text (kanan 50)
    hjust = 0, #Ujung
    segment.size = 1,               #Ukuran garis
    segment.alpha = .75,             #transparasi garis
    segment.linetype = "dotted",    #Time garis
    box.padding = .4, #Biar label saham nggak dempetan
    segment.curvature = -0.1, #biar garis mulus
    segment.ncp = 8, 
    segment.angle = 60 
  ) +
  #Axis
    coord_cartesian(clip = "off"
  ) +
    scale_x_date( #Sumbu x
    date_breaks = "1 year",  # Menampilkan label setiap tahun
    date_labels = "%Y",  # Format label tahun
    limits = c(as.Date("2018-07-30"), as.Date("2023-12-28"))
    #Tampilin lebih dari 20023-07-28 agar label saham bisa masuk
  ) +
    scale_y_continuous( #Sumbu y
    labels = scales::dollar_format(prefix = "$") #tambahin dolar
  ) +
    annotate( #Buat nandain batas data
    "text", x = as.Date("2023-7-28"), y = 50, 
    label = "28 Juli", size=6
  ) +
  geom_vline( #Buat garis batas data
    xintercept = as.numeric(as.Date("2023-07-28")), 
             linetype = "dotted", color = "red")
chart

#Export Chart
ggsave("01_Time Series MAANG.png", chart, path = export.chart,
        dpi = 300, height = 12, width = 23)

Jika dilihat dari tahun 2019-2022, semua saham cenderung memiliki pola trend naik. Lalu dari 2021-2023 polanya cenderung trend turun. Untuk tugas praktikum kali ini, saya hanya akan menggunakan rentang tahun 2022-2023 dengan tren cenderung turun. Agar pengerjaannya tidak terlalu sulit, karena masih tahap awal pembelajaran.

1.3.2 Time Series Apple

aapl <- data %>%
  select(1, 2, 7) %>%  # Memilih kolom 1, 2, dan 7
  filter(Name == "AAPL", Date >= as.Date("2022-01-01"))  # Filter data saham Amazon tahun 2022 ke atas

rownames(aapl) <- NULL
str(aapl)
## 'data.frame':    394 obs. of  3 variables:
##  $ Name     : chr  "AAPL" "AAPL" "AAPL" "AAPL" ...
##  $ Date     : Date, format: "2022-01-03" "2022-01-04" ...
##  $ Adj Close: num  180 178 173 171 171 ...
datatable(aapl, filter = 'top', 
          options = list(pageLength = 5))

Mengubah Ajd Close Menjadi Time series.

aapl.ts <- ts(aapl[,3])

Ringkasan Data Ajd CLose.

summary(aapl.ts)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   124.7   145.7   156.5   157.9   169.2   195.8
min_value <- min(aapl$`Adj Close`)
min_date <- aapl$Date[which.min(aapl$`Adj Close`)]
percentage <- (which.min(aapl$`Adj Close`) / nrow(aapl)) * 100

chart <-
ggplot(aapl, aes(x=Date, y=`Adj Close`)) + 
  geom_line(aes(color=Name), linewidth=2) +
  scale_color_manual(values = c("lightskyblue4")) +
  labs(x = "\nPeriode (Tahun)", y='Saham Harga penutup',
       title = "Time Series Saham Apple",
       subtitle = "Seperti apa sih pola deret waktu saham Apple?\n") +
  theme(legend.position = "none") +
  theme.ts1 + 
  geom_vline(xintercept = as.numeric(min_date), 
             linetype = "dotted", color = "grey30", linewidth = 1.5) +
  geom_text(aes(x = min_date-1*40, y = max(`Adj Close`)*80/100, label = 
                  paste0("Titik Terendah\n","(",round(percentage, 2), "%)",
                         "   ",min_date)), 
            vjust = -1.5, hjust = 0, size = 7, color = "grey30") 
chart

#Export Chart
ggsave("03_Time Series Apple.png", chart, path = export.chart,
        dpi = 300, height = 12, width = 20)

Berdasarkan chart data deret waktu diatas, terlihat bahwa data cenderung memiliki trend naik dan turun dengan titik potong di tanggal 20222-12-28. Namun titik potongnya masih jauh dari angka \(80\%\). Sehingga tidak akan dijadikan acuan untuk pemisahan data training dan testing.

Pembagian Data Training Dan Test.

#membagi 80% data latih (training) dan 20% data uji (testing)
train_aapl <- aapl[1: round(nrow(aapl) *80/100),]
test_aapl <- aapl[round(nrow(aapl) *80/100): nrow(aapl),]
train_aapl.ts <- ts(train_aapl[,3])
test_aapl.ts <- ts(train_aapl[,3])
chart <-
ggplot() + 
  geom_line(data = train_aapl, linewidth=2,
            aes(x = Date, y = `Adj Close`, col = "Data Latih")) +
  geom_line(data = test_aapl, linewidth=2,
            aes(x = Date, y = `Adj Close`, col = "Data Uji")) +
  labs(x = "\nPeriode (Tahun)", y='Saham Harga penutup',
       title = "Time Series Saham Apple",
       subtitle = "Pembagian Data Training dan Test\n") +
  theme(legend.position = "none") +
  scale_colour_manual(name="Keterangan:", 
                      breaks = c("Data Latih", "Data Uji"),
                      values = c("lightskyblue4", "grey30")) + theme.ts1
chart

#Export Chart
ggsave("03_TS_AAPL_train-test.png", chart, path = export.chart,
        dpi = 300, height = 12, width = 20)

Berdasarkan plot data deret waktu pada data training, terlihat bahwa data cenderung memiliki trend yang turun dan cenderung tidak bergerak pada nilai tengah tertentu. Hal ini mengindikasikan bahwa data tidak stasioner dalam rataan. Pada plot data uji, terlihat bahwa data cenderung memiliki trend yang naik dan cenderung tidak bergerak pada nilai tengah tertentu. Hal ini mengindikasikan bahwa data uji tidak stasioner dalam rataan.

1.3.3 Time Series Amazon

amzn <- data %>%
  select(1, 2, 7) %>%  # Memilih kolom 1, 2, dan 7
  filter(Name == "AMZN", Date >= as.Date("2022-01-01"))  # Filter data saham Amazon tahun 2022 ke atas

rownames(amzn) <- NULL
str(amzn)
## 'data.frame':    394 obs. of  3 variables:
##  $ Name     : chr  "AMZN" "AMZN" "AMZN" "AMZN" ...
##  $ Date     : Date, format: "2022-01-03" "2022-01-04" ...
##  $ Adj Close: num  170 168 164 163 163 ...
datatable(amzn, filter = 'top', 
          options = list(pageLength = 5))

Mengubah Ajd Close Menjadi Time series.

amzn.ts <- ts(amzn[,3])

Ringkasan Data Ajd CLose.

summary(amzn.ts)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   81.82  102.01  115.77  119.81  134.88  170.40
min_value <- min(amzn$`Adj Close`)
min_date <- amzn$Date[which.min(amzn$`Adj Close`)]
percentage <- (which.min(amzn$`Adj Close`) / nrow(amzn)) * 100

chart <-
ggplot(amzn, aes(x=Date, y=`Adj Close`)) + 
  geom_line(aes(color=Name), linewidth=2) +
  scale_color_manual(values = c("orange2")) +
  labs(x = "\nPeriode (Tahun)", y='Saham Harga penutup',
       title = "Time Series Saham Amazon",
       subtitle = "Seperti apa sih pola deret waktu saham Amazon?\n") +
  theme(legend.position = "none") +
  theme.ts1 + 
  geom_vline(xintercept = as.numeric(min_date), 
             linetype = "dotted", color = "grey30", linewidth = 1.5) +
  geom_text(aes(x = min_date-1*40, y = max(`Adj Close`)*80/100, label = 
                  paste0("Titik Potong\n","(",round(percentage, 2), "%)",
                         "   ",min_date)), 
            vjust = -1.5, hjust = 0, size = 7, color = "grey30") 
chart

#Export Chart
ggsave("02_Time Series Amazon.png", chart, path = export.chart,
        dpi = 300, height = 12, width = 20)

Berdasarkan chart data deret waktu diatas, terlihat bahwa data cenderung memiliki trend naik dan turun dengan titik potong di tanggal 20222-12-28. Namun titik potongnya masih jauh dari angka \(80\%\). Sehingga tidak akan dijadikan acuan untuk pemisahan data training dan testing.

Pembagian Data Training Dan Test.

#membagi 80% data latih (training) dan 20% data uji (testing)
train_amzn <- amzn[1: round(nrow(amzn) *80/100),]
test_amzn <- amzn[round(nrow(amzn) *80/100): nrow(amzn),]
train_amzn.ts <- ts(train_amzn[,3])
test_amzn.ts <- ts(test_amzn[,3])
chart <-
ggplot() + 
  geom_line(data = train_amzn, linewidth=2,
            aes(x = Date, y = `Adj Close`, col = "Data Latih")) +
  geom_line(data = test_amzn, linewidth=2,
            aes(x = Date, y = `Adj Close`, col = "Data Uji")) +
  labs(x = "\nPeriode (Tahun)", y='Saham Harga penutup',
       title = "Time Series Saham Amazon",
       subtitle = "Pembagian Data Training dan Test\n") +
  theme(legend.position = "none") +
  scale_colour_manual(name="Keterangan:", 
                      breaks = c("Data Latih", "Data Uji"),
                      values = c("orange", "grey30")) + theme.ts1
chart

#Export Chart
ggsave("02_TS_Amazon_train-test.png", chart, path = export.chart,
        dpi = 300, height = 12, width = 20)

Berdasarkan plot data deret waktu pada data training, terlihat bahwa data cenderung memiliki trend yang turun dan cenderung tidak bergerak pada nilai tengah tertentu. Hal ini mengindikasikan bahwa data tidak stasioner dalam rataan. Pada plot data uji, terlihat bahwa data cenderung memiliki trend yang naik dan cenderung tidak bergerak pada nilai tengah tertentu. Hal ini mengindikasikan bahwa data uji tidak stasioner dalam rataan.

1.3.4 Time Series Google

goog <- data %>%
  select(1, 2, 7) %>%  # Memilih kolom 1, 2, dan 7
  filter(Name == "GOOG", Date >= as.Date("2022-01-01"))  # Filter data saham Amazon tahun 2022 ke atas

rownames(goog) <- NULL
str(goog)
## 'data.frame':    394 obs. of  3 variables:
##  $ Name     : chr  "GOOG" "GOOG" "GOOG" "GOOG" ...
##  $ Date     : Date, format: "2022-01-03" "2022-01-04" ...
##  $ Adj Close: num  145 144 138 138 137 ...
datatable(goog, filter = 'top', 
          options = list(pageLength = 5))

Mengubah Ajd Close Menjadi Time series.

goog.ts <- ts(goog[,3])

Ringkasan Data Ajd CLose.

summary(goog.ts)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   83.49  100.08  112.11  112.73  123.48  148.04
min_value <- min(goog$`Adj Close`)
min_date <- goog$Date[which.min(goog$`Adj Close`)]
percentage <- (which.min(goog$`Adj Close`) / nrow(goog)) * 100

chart <-
ggplot(goog, aes(x=Date, y=`Adj Close`)) + 
  geom_line(aes(color=Name), linewidth=2) +
  scale_color_manual(values = c("gold3")) +
  labs(x = "\nPeriode (Tahun)", y='Saham Harga penutup',
       title = "Time Series Saham Google",
       subtitle = "Seperti apa sih pola deret waktu saham Google?\n") +
  theme(legend.position = "none") +
  theme.ts1 + 
  geom_vline(xintercept = as.numeric(min_date), 
             linetype = "dotted", color = "grey30", linewidth = 1.5) +
  geom_text(aes(x = min_date-1*40, y = max(`Adj Close`)*80/100, label = 
                  paste0("Titik Terendah\n","(",round(percentage, 2), "%)",
                         "   ",min_date)), 
            vjust = -1.5, hjust = 0, size = 7, color = "grey30") 
chart

#Export Chart
ggsave("04_Time Series Google.png", chart, path = export.chart,
        dpi = 300, height = 12, width = 20)

Berdasarkan chart data deret waktu diatas, terlihat bahwa data cenderung memiliki trend naik dan turun dengan titik potong di tanggal 20222-12-28. Namun titik potongnya masih jauh dari angka \(80\%\). Sehingga tidak akan dijadikan acuan untuk pemisahan data training dan testing.

Pembagian Data Training Dan Test.

#membagi 80% data latih (training) dan 20% data uji (testing)
train_goog <- goog[1: round(nrow(goog) *80/100),]
test_goog <- goog[round(nrow(goog) *80/100): nrow(goog),]
train_goog.ts <- ts(train_goog[,3])
test_goog.ts <- ts(test_goog[,3])
chart <-
ggplot() + 
  geom_line(data = train_goog, linewidth=2,
            aes(x = Date, y = `Adj Close`, col = "Data Latih")) +
  geom_line(data = test_goog, linewidth=2,
            aes(x = Date, y = `Adj Close`, col = "Data Uji")) +
  labs(x = "\nPeriode (Tahun)", y='Saham Harga penutup',
       title = "Time Series Saham Google",
       subtitle = "Pembagian Data Training dan Test\n") +
  theme(legend.position = "none") +
  scale_colour_manual(name="Keterangan:", 
                      breaks = c("Data Latih", "Data Uji"),
                      values = c("gold3", "grey30")) + theme.ts1
chart

#Export Chart
ggsave("04_TS_GOOG_train-test.png", chart, path = export.chart,
        dpi = 300, height = 12, width = 20)

Berdasarkan plot data deret waktu pada data training, terlihat bahwa data cenderung memiliki trend yang turun dan cenderung tidak bergerak pada nilai tengah tertentu. Hal ini mengindikasikan bahwa data tidak stasioner dalam rataan. Pada plot data uji, terlihat bahwa data cenderung memiliki trend yang naik dan cenderung tidak bergerak pada nilai tengah tertentu. Hal ini mengindikasikan bahwa data uji tidak stasioner dalam rataan.

1.3.5 Time Series META

meta <- data %>%
  select(1, 2, 7) %>%  # Memilih kolom 1, 2, dan 7
  filter(Name == "META", Date >= as.Date("2022-01-01"))  # Filter data saham Amazon tahun 2022 ke atas

rownames(meta) <- NULL
str(meta)
## 'data.frame':    394 obs. of  3 variables:
##  $ Name     : chr  "META" "META" "META" "META" ...
##  $ Date     : Date, format: "2022-01-03" "2022-01-04" ...
##  $ Adj Close: num  339 337 324 332 332 ...
datatable(meta, filter = 'top', 
          options = list(pageLength = 5))

Mengubah Ajd Close Menjadi Time series.

meta.ts <- ts(meta[,3])

Ringkasan Data Ajd CLose.

summary(meta.ts)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   88.91  156.15  187.84  195.00  223.21  338.54
min_value <- min(meta$`Adj Close`)
min_date <- meta$Date[which.min(meta$`Adj Close`)]
percentage <- (which.min(meta$`Adj Close`) / nrow(meta)) * 100

chart <-
ggplot(meta, aes(x=Date, y=`Adj Close`)) + 
  geom_line(aes(color=Name), linewidth=2) +
  scale_color_manual(values = c("dodgerblue3")) +
  labs(x = "\nPeriode (Tahun)", y='Saham Harga penutup',
       title = "Time Series Saham META",
       subtitle = "Seperti apa sih pola deret waktu saham META?\n") +
  theme(legend.position = "none") +
  theme.ts1 + 
  geom_vline(xintercept = as.numeric(min_date), 
             linetype = "dotted", color = "grey30", linewidth = 1.5) +
  geom_text(aes(x = min_date-1*40, y = max(`Adj Close`)*80/100, label = 
                  paste0("Titik Terendah\n","(",round(percentage, 2), "%)",
                         "   ",min_date)), 
            vjust = -1.5, hjust = 0, size = 7, color = "grey30") 
chart

#Export Chart
ggsave("05_Time Series META.png", chart, path = export.chart,
        dpi = 300, height = 12, width = 20)

Berdasarkan chart data deret waktu diatas, terlihat bahwa data cenderung memiliki trend naik dan turun dengan titik potong di tanggal 20222-12-28. Namun titik potongnya masih jauh dari angka \(80\%\). Sehingga tidak akan dijadikan acuan untuk pemisahan data training dan testing.

Pembagian Data Training Dan Test.

#membagi 80% data latih (training) dan 20% data uji (testing)
train_meta <- meta[1: round(nrow(meta) *80/100),]
test_meta <- meta[round(nrow(meta) *80/100): nrow(meta),]
train_meta.ts <- ts(train_meta[,3])
test_meta.ts <- ts(test_meta[,3])
chart <-
ggplot() + 
  geom_line(data = train_meta, linewidth=2,
            aes(x = Date, y = `Adj Close`, col = "Data Latih")) +
  geom_line(data = test_meta, linewidth=2,
            aes(x = Date, y = `Adj Close`, col = "Data Uji")) +
  labs(x = "\nPeriode (Tahun)", y='Saham Harga penutup',
       title = "Time Series Saham META",
       subtitle = "Pembagian Data Training dan Test\n") +
  theme(legend.position = "none") +
  scale_colour_manual(name="Keterangan:", 
                      breaks = c("Data Latih", "Data Uji"),
                      values = c("dodgerblue3", "grey30")) + theme.ts1
chart

#Export Chart
ggsave("05_TS_META_train-test.png", chart, path = export.chart,
        dpi = 300, height = 12, width = 20)

Berdasarkan plot data deret waktu pada data training, terlihat bahwa data cenderung memiliki trend yang turun dan cenderung tidak bergerak pada nilai tengah tertentu. Hal ini mengindikasikan bahwa data tidak stasioner dalam rataan. Pada plot data uji, terlihat bahwa data cenderung memiliki trend yang naik dan cenderung tidak bergerak pada nilai tengah tertentu. Hal ini mengindikasikan bahwa data uji tidak stasioner dalam rataan.

1.3.6 Time Series Microsoft

msft <- data %>%
  select(1, 2, 7) %>%  # Memilih kolom 1, 2, dan 7
  filter(Name == "MSFT", Date >= as.Date("2022-01-01"))  # Filter data saham Amazon tahun 2022 ke atas

rownames(msft) <- NULL
str(msft)
## 'data.frame':    394 obs. of  3 variables:
##  $ Name     : chr  "MSFT" "MSFT" "MSFT" "MSFT" ...
##  $ Date     : Date, format: "2022-01-03" "2022-01-04" ...
##  $ Adj Close: num  330 324 312 310 310 ...
datatable(msft, filter = 'top', 
          options = list(pageLength = 5))

Mengubah Ajd Close Menjadi Time series.

msft.ts <- ts(msft[,3])

Ringkasan Data Ajd CLose.

summary(msft.ts)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   212.6   249.5   271.8   275.4   296.7   359.5
min_value <- min(msft$`Adj Close`)
min_date <- msft$Date[which.min(msft$`Adj Close`)]
percentage <- (which.min(msft$`Adj Close`) / nrow(msft)) * 100

chart <-
ggplot(msft, aes(x=Date, y=`Adj Close`)) + 
  geom_line(aes(color=Name), linewidth=2) +
  scale_color_manual(values = c("deepskyblue2")) +
  labs(x = "\nPeriode (Tahun)", y='Saham Harga penutup',
       title = "Time Series Saham Microsoft",
       subtitle = "Seperti apa sih pola deret waktu saham Microsoft?\n") +
  theme(legend.position = "none") +
  theme.ts1 + 
  geom_vline(xintercept = as.numeric(min_date), 
             linetype = "dotted", color = "grey30", linewidth = 1.5) +
  geom_text(aes(x = min_date-1*40, y = max(`Adj Close`)*80/100, label = 
                  paste0("Titik Terendah\n","(",round(percentage, 2), "%)",
                         "   ",min_date)), 
            vjust = -1.5, hjust = 0, size = 7, color = "grey30") 
chart

#Export Chart
ggsave("06_Time Series Microsoft.png", chart, path = export.chart,
        dpi = 300, height = 12, width = 20)

Berdasarkan chart data deret waktu diatas, terlihat bahwa data cenderung memiliki trend naik dan turun dengan titik potong di tanggal 20222-12-28. Namun titik potongnya masih jauh dari angka \(80\%\). Sehingga tidak akan dijadikan acuan untuk pemisahan data training dan testing.

Pembagian Data Training Dan Test.

#membagi 80% data latih (training) dan 20% data uji (testing)
train_msft <- msft[1: round(nrow(msft) *80/100),]
test_msft <- msft[round(nrow(msft) *80/100): nrow(msft),]
train_msft.ts <- ts(train_msft[,3])
test_msft.ts <- ts(test_msft[,3])
chart <-
ggplot() + 
  geom_line(data = train_msft, linewidth=2,
            aes(x = Date, y = `Adj Close`, col = "Data Latih")) +
  geom_line(data = test_msft, linewidth=2,
            aes(x = Date, y = `Adj Close`, col = "Data Uji")) +
  labs(x = "\nPeriode (Tahun)", y='Saham Harga penutup',
       title = "Time Series Saham Microsoft",
       subtitle = "Pembagian Data Training dan Test\n") +
  theme(legend.position = "none") +
  scale_colour_manual(name="Keterangan:", 
                      breaks = c("Data Latih", "Data Uji"),
                      values = c("deepskyblue2", "grey30")) + theme.ts1
chart

#Export Chart
ggsave("06_TS_MSFT_train-test.png", chart, path = export.chart,
        dpi = 300, height = 12, width = 20)

Berdasarkan plot data deret waktu pada data training, terlihat bahwa data cenderung memiliki trend yang turun dan cenderung tidak bergerak pada nilai tengah tertentu. Hal ini mengindikasikan bahwa data tidak stasioner dalam rataan. Pada plot data uji, terlihat bahwa data cenderung memiliki trend yang naik dan cenderung tidak bergerak pada nilai tengah tertentu. Hal ini mengindikasikan bahwa data uji tidak stasioner dalam rataan.

1.3.7 Time Series Netflix

nflx <- data %>%
  select(1, 2, 7) %>%  # Memilih kolom 1, 2, dan 7
  filter(Name == "NFLX", Date >= as.Date("2022-01-01"))  # Filter data saham Amazon tahun 2022 ke atas

rownames(nflx) <- NULL
str(nflx)
## 'data.frame':    394 obs. of  3 variables:
##  $ Name     : chr  "NFLX" "NFLX" "NFLX" "NFLX" ...
##  $ Date     : Date, format: "2022-01-03" "2022-01-04" ...
##  $ Adj Close: num  597 591 568 553 541 ...
datatable(nflx, filter = 'top', 
          options = list(pageLength = 5))

Mengubah Ajd Close Menjadi Time series.

nflx.ts <- ts(nflx[,3])

Ringkasan Data Ajd CLose.

summary(nflx.ts)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   166.4   232.8   317.7   312.6   367.8   597.4
min_value <- min(nflx$`Adj Close`)
min_date <- nflx$Date[which.min(nflx$`Adj Close`)]
percentage <- (which.min(nflx$`Adj Close`) / nrow(nflx)) * 100

chart <-
ggplot(nflx, aes(x=Date, y=`Adj Close`)) + 
  geom_line(aes(color=Name), linewidth=2) +
  scale_color_manual(values = c("firebrick3")) +
  labs(x = "\nPeriode (Tahun)", y='Saham Harga penutup',
       title = "Time Series Saham Netflix",
       subtitle = "Seperti apa sih pola deret waktu saham Netflix?\n") +
  theme(legend.position = "none") +
  theme.ts1 + 
  geom_vline(xintercept = as.numeric(min_date), 
             linetype = "dotted", color = "grey30", linewidth = 1.5) +
  geom_text(aes(x = min_date-1*40, y = max(`Adj Close`)*80/100, label = 
                  paste0("Titik Terendah\n","(",round(percentage, 2), "%)",
                         "   ",min_date)), 
            vjust = -1.5, hjust = 0, size = 7, color = "grey30") 
chart

#Export Chart
ggsave("07_Time Series Netflix.png", chart, path = export.chart,
        dpi = 300, height = 12, width = 20)

Berdasarkan chart data deret waktu diatas, terlihat bahwa data cenderung memiliki trend naik dan turun dengan titik potong di tanggal 20222-12-28. Namun titik potongnya masih jauh dari angka \(80\%\). Sehingga tidak akan dijadikan acuan untuk pemisahan data training dan testing.

Pembagian Data Training Dan Test.

#membagi 80% data latih (training) dan 20% data uji (testing)
train_nflx <- nflx[1: round(nrow(nflx) *80/100),]
test_nflx <- nflx[round(nrow(nflx) *80/100): nrow(nflx),]
train_nflx.ts <- ts(train_nflx[,3])
test_nflx.ts <- ts(test_nflx[,3])
chart <-
ggplot() + 
  geom_line(data = train_nflx, linewidth=2,
            aes(x = Date, y = `Adj Close`, col = "Data Latih")) +
  geom_line(data = test_nflx, linewidth=2,
            aes(x = Date, y = `Adj Close`, col = "Data Uji")) +
  labs(x = "\nPeriode (Tahun)", y='Saham Harga penutup',
       title = "Time Series Saham Netflix",
       subtitle = "Pembagian Data Training dan Test\n") +
  theme(legend.position = "none") +
  scale_colour_manual(name="Keterangan:", 
                      breaks = c("Data Latih", "Data Uji"),
                      values = c("firebrick3", "grey30")) + theme.ts1
chart

#Export Chart
ggsave("07_TS_NFLX_train-test.png", chart, path = export.chart,
        dpi = 300, height = 12, width = 20)

Berdasarkan plot data deret waktu pada data training, terlihat bahwa data cenderung memiliki trend yang turun dan cenderung tidak bergerak pada nilai tengah tertentu. Hal ini mengindikasikan bahwa data tidak stasioner dalam rataan. Pada plot data uji, terlihat bahwa data cenderung memiliki trend yang naik dan cenderung tidak bergerak pada nilai tengah tertentu. Hal ini mengindikasikan bahwa data uji tidak stasioner dalam rataan.

1.3.8 Time Series NVIDIA

nvda <- data %>%
  select(1, 2, 7) %>%  # Memilih kolom 1, 2, dan 7
  filter(Name == "NVDA", Date >= as.Date("2022-01-01"))  # Filter data saham Amazon tahun 2022 ke atas

rownames(nvda) <- NULL
str(nvda)
## 'data.frame':    394 obs. of  3 variables:
##  $ Name     : chr  "NVDA" "NVDA" "NVDA" "NVDA" ...
##  $ Date     : Date, format: "2022-01-03" "2022-01-04" ...
##  $ Adj Close: num  301 293 276 281 272 ...
datatable(nvda, filter = 'top', 
          options = list(pageLength = 5))

Mengubah Ajd Close Menjadi Time series.

nvda.ts <- ts(nvda[,3])

Ringkasan Data Ajd CLose.

summary(nvda.ts)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   112.2   162.5   207.0   226.0   267.4   474.9
min_value <- min(nvda$`Adj Close`)
min_date <- nvda$Date[which.min(nvda$`Adj Close`)]
percentage <- (which.min(nvda$`Adj Close`) / nrow(nvda)) * 100

chart <-
ggplot(nvda, aes(x=Date, y=`Adj Close`)) + 
  geom_line(aes(color=Name), linewidth=2) +
  scale_color_manual(values = c("green4")) +
  labs(x = "\nPeriode (Tahun)", y='Saham Harga penutup',
       title = "Time Series Saham NVIDIA",
       subtitle = "Seperti apa sih pola deret waktu saham NVIDIA?\n") +
  theme(legend.position = "none") +
  theme.ts1 + 
  geom_vline(xintercept = as.numeric(min_date), 
             linetype = "dotted", color = "grey30", linewidth = 1.5) +
  geom_text(aes(x = min_date-1*40, y = max(`Adj Close`)*80/100, label = 
                  paste0("Titik Terendah\n","(",round(percentage, 2), "%)",
                         "   ",min_date)), 
            vjust = -1.5, hjust = 0, size = 7, color = "grey30") 
chart

#Export Chart
ggsave("08_Time Series NVIDIA.png", chart, path = export.chart,
        dpi = 300, height = 12, width = 20)

Berdasarkan chart data deret waktu diatas, terlihat bahwa data cenderung memiliki trend naik dan turun dengan titik potong di tanggal 20222-12-28. Namun titik potongnya masih jauh dari angka \(80\%\). Sehingga tidak akan dijadikan acuan untuk pemisahan data training dan testing.

Pembagian Data Training Dan Test.

#membagi 80% data latih (training) dan 20% data uji (testing)
train_nvda <- nvda[1: round(nrow(nvda) *80/100),]
test_nvda <- nvda[round(nrow(nvda) *80/100): nrow(nvda),]
train_nvda.ts <- ts(train_nvda[,3])
test_nvda.ts <- ts(test_nvda[,3])
chart <-
ggplot() + 
  geom_line(data = train_nvda, linewidth=2,
            aes(x = Date, y = `Adj Close`, col = "Data Latih")) +
  geom_line(data = test_nvda, linewidth=2,
            aes(x = Date, y = `Adj Close`, col = "Data Uji")) +
  labs(x = "\nPeriode (Tahun)", y='Saham Harga penutup',
       title = "Time Series Saham NVIDIA",
       subtitle = "Pembagian Data Training dan Test\n") +
  theme(legend.position = "none") +
  scale_colour_manual(name="Keterangan:", 
                      breaks = c("Data Latih", "Data Uji"),
                      values = c("green4", "grey30")) + theme.ts1
chart

#Export Chart
ggsave("08_TS_NVDA_train-test.png", chart, path = export.chart,
        dpi = 300, height = 12, width = 20)

Berdasarkan plot data deret waktu pada data training, terlihat bahwa data cenderung memiliki trend yang turun dan cenderung tidak bergerak pada nilai tengah tertentu. Hal ini mengindikasikan bahwa data tidak stasioner dalam rataan. Pada plot data uji, terlihat bahwa data cenderung memiliki trend yang naik dan cenderung tidak bergerak pada nilai tengah tertentu. Hal ini mengindikasikan bahwa data uji tidak stasioner dalam rataan.

2 Apple

2.1 Uji Stasioner Data

install_load('tsibble','tseries')

2.1.1 Plot ACF

acf(train_aapl.ts)

Berdasarkan plot ACF, terlihat bahwa plot ACF data train menurun secara perlahan (tails of slowly). Hal ini juga menjadi indikasi bahwa data tidak stasioner dalam rataan dan tidak membentuk gelombang sinus.

2.1.2 Uji ADF

tseries::adf.test(train_aapl.ts)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  train_aapl.ts
## Dickey-Fuller = -2.2316, Lag order = 6, p-value = 0.4788
## alternative hypothesis: stationary

\(H_0\) : Data tidak stasioner dalam rataan

\(H_1\) : Data stasioner dalam rataan

Berdasarkan uji ADF tersebut, didapat p-value sebesar \(0.3071\) yang lebih besar dari taraf nyata \(5\%\) sehingga tak tolak \(H_0\) dan menandakan bahwa data tidak stasioner dalam rataan. Hal ini sesuai dengan hasil eksplorasi menggunakan plot time series dan plot ACF, sehingga ketidakstasioneran model kedepannya harus ditangani.

2.1.3 Plot Box-Cox

install_load('MASS')
index <- seq(1:nrow(aapl))
bc = boxcox(aapl.ts~index, lambda = seq(-2, 4, by=0.01))

#Nilai Rounded Lambda
lambda_aapl <- bc$x[which.max(bc$y)]
#SK
sk_aapl <- bc$x[bc$y > max(bc$y) - 1/2 * qchisq(.95,1)]
cat(" Lambda :", lambda_aapl,
    "\n\n Selang Kepercyaan 95% \n",
    "Batas Bawah :", min(sk_aapl), "\n Batas Bawah :", max(sk_aapl) )
##  Lambda : 0.06 
## 
##  Selang Kepercyaan 95% 
##  Batas Bawah : -0.88 
##  Batas Bawah : 0.99

Gambar di atas menunjukkan nilai rounded value (\(\lambda\)) optimum sebesar \(0.21\) dan pada selang kepercayaan \(95\%\) nilai memiliki batas bawah \(0\) dan batas atas \(0.74\). Selang tersebut tidak memuat nilai satu sehingga dapat dikatakan bahwa data saham amazon tidak stasioner dalam ragam.

2.1.4 Penanganan Ketidakstasioneran Data

train_aapl.diff <- diff(train_aapl.ts, differences = 1) 
plot.ts(train_aapl.diff, lty=1, xlab="Periode (Tahun)", 
        col = "lightskyblue4", lwd = 3.5,
        main="Plot Difference Saham Amazon")

Berdasarkan plot data deret waktu, terlihat bahwa data sudah stasioner dalam rataan ditandai dengan data bergerak pada nilai tengah tertentu (tidak terdapat trend ataupun musiman pada data).

2.2 Uji Ulang

2.2.1 Plot ACF

acf(train_aapl.diff)

Berdasarkan plot tersebut, terlihat bahwa plot ACF cuts off pada lag ke 13. Sejalan dengan penanganannya, data sudah stasioner dalam rataan dan ketidakstasioneran data telah berhasil tertangani.

2.2.2 Uji ADF

tseries::adf.test(train_aapl.diff)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  train_aapl.diff
## Dickey-Fuller = -6.335, Lag order = 6, p-value = 0.01
## alternative hypothesis: stationary

\(H_0\) : Data tidak stasioner dalam rataan

\(H_1\) : Data stasioner dalam rataan

Berdasarkan uji ADF tersebut, didapat p-value sebesar \(0.01\) yang lebih kecil dari taraf nyata \(5\%\) sehingga tolak \(H_0\) atau data stasioner dalam rataan. Hal ini sesuai dengan hasil eksplorasi menggunakan plot time series dan plot ACF, sehingga dalam hal ini ketidakstasioneran data sudah berhasil ditangani dan dapat dilanjutkan ke pemodelan.

2.3 Identifikasi Model

2.3.1 Plot ACF

acf(train_aapl.diff)

Berdasarkan plot tersebut, terlihat bahwa plot ACF cenderung cuts off pada lag ke 13.

2.3.2 PACF

pacf(train_aapl.diff)

Berdasarkan plot tersebut, terlihat bahwa plot PACF cenderung cuts off pada lag ke 13 dan 15.

2.3.3 Plot EACF

install_load('TSA')
eacf(train_aapl.diff)
## AR/MA
##   0 1 2 3 4 5 6 7 8 9 10 11 12 13
## 0 o o o o o o o o o o o  o  o  o 
## 1 x o o o o o o o o o o  o  o  o 
## 2 x x o o o o o o o o o  o  o  o 
## 3 x o x o o o o o o o o  o  o  o 
## 4 x x x x o o o o o o o  o  o  o 
## 5 o x x x x o o o o o o  o  o  o 
## 6 x o x x x o o o o o o  o  o  o 
## 7 x o x o x x x o o o o  o  o  o

Identifikasi model menggunakan plot EACF dilakukan dengan melihat titik sudut kiri segitiga pada pola segitiga nol atas (pola mariks segitiga bawah).

Dalam hal ini model tentatif yang terbentuk adalah ARIMA(0,1,1), ARIMA(1,1,1), ARIMA(2,1,2), ARIMA(3,1,3), dst..

2.4 Pendugaan Parameter Model Tentatif

Keterangan parameter function :

  • data = data Time Series baik yang sudah di .diff maupun belum

  • p_max = ordo maksimal dari AR

  • d = ordo I

  • q_max = ordo maksimal dari MA

  • alpha = alpha

install_load('forecast')

# Fungsi untuk menghitung model ARIMA dan menganalisis parameter
model_tentatif <- function(data, p_max, d, q_max, alpha=0.05) {
  best_model <- NULL
  best_aic <- Inf
  eacf_result <- eacf(data)
  models <- data.frame(Model = character(0), 
                       AIC = numeric(0), 
                       Signif = character(0), 
                       Keterangan = character(0))
  
  for (p in 0:p_max) {
    for (q in 1:q_max) {
      if (!is.na(eacf_result$symbol[p + 1, q + 1]) && 
          !is.na(eacf_result$symbol[p + 1, q + 2]) && 
          !is.na(eacf_result$symbol[p + 2, q + 2])) {
        if (eacf_result$symbol[p + 1, q + 1] == "o" && 
            eacf_result$symbol[p + 1, q + 2] == "o" && 
            eacf_result$symbol[p + 2, q + 2] == "o") {
      
          model <- Arima(data, order = c(p, d, q), method = "ML")
          aic <- AIC(model)
          
          # Mendapatkan nilai coef dari model
          coeftest_result <- lmtest::coeftest(model)
          
          # jika lebih kecil dari alpha, maka signifikan
          significant_params <- 
            rownames(coeftest_result)[coeftest_result[, "Pr(>|z|)"] < alpha]  
          
          # jika lebih besar dari alpha, maka tidak signifikan
          non_significant_params <- 
            rownames(coeftest_result)[coeftest_result[, "Pr(>|z|)"] > alpha]  
          
          # Keterangan signifikansi
          if (length(significant_params) == 0) {
            keterangan <- "Semua parameter tidak signifikan"
          } else if (length(significant_params) == nrow(coeftest_result)) {
            keterangan <- "Semua parameter signifikan"
          } else {
            keterangan <- paste("Parameter yang tidak signifikan adalah", 
                                paste(non_significant_params, collapse = ", "))
          }
          
          models <- rbind(models, 
                    data.frame(Model = paste("ARIMA(", p, ",", d, ",", q, ")", 
                                             sep = ""), 
                               AIC = aic, 
                               Signif = paste(significant_params, collapse = ", "), 
                               Keterangan = keterangan))
          
            if (aic < best_aic) {
              best_model <- model
              best_aic <- aic
          }
        }
      }
    }
  }
  
  cat("\nModel ARIMA dengan AIC terkecil:\n")
  print(best_model)

  datatable(models, filter = 'top', 
          options = list(pageLength = 5))
}

# Panggil Fungsi
model_tentatif(train_aapl.diff, p_max = 6, d = 1, q_max = 12)
## AR/MA
##   0 1 2 3 4 5 6 7 8 9 10 11 12 13
## 0 o o o o o o o o o o o  o  o  o 
## 1 x o o o o o o o o o o  o  o  o 
## 2 x x o o o o o o o o o  o  o  o 
## 3 x o x o o o o o o o o  o  o  o 
## 4 x x x x o o o o o o o  o  o  o 
## 5 o x x x x o o o o o o  o  o  o 
## 6 x o x x x o o o o o o  o  o  o 
## 7 x o x o x x x o o o o  o  o  o 
## 
## Model ARIMA dengan AIC terkecil:
## Series: data 
## ARIMA(3,1,4) 
## 
## Coefficients:
##          ar1     ar2      ar3      ma1     ma2     ma3      ma4
##       0.3796  0.1875  -0.8299  -1.3693  0.0742  1.2637  -0.9661
## s.e.  0.0472  0.0582   0.0466   0.0466  0.0665  0.0624   0.0525
## 
## sigma^2 = 9.69:  log likelihood = -800.87
## AIC=1617.75   AICc=1618.22   BIC=1647.72

Berdasarkan pendugaan parameter di atas, nilai AIC terkecil \(1617.75\) dimiliki oleh model ARIMA(3,1,4) dan seluruh parameternya signifikan sehingga model yang dipilih adalah model ARIMA(3,1,4) .

model_aapl.da <- Arima(train_aapl.diff, order=c(3,1,4), method="ML")

2.5 Analisis Sisaan

Model terbaik hasil identifikasi kemudian dicek asumsi sisaannya. Sisaan model ARIMA harus memenuhi asumsi normalitas, kebebasan sisaan, dan kehomogenan ragam. Diagnostik model dilakukan secara eksplorasi dan uji formal.

2.5.1 Eksplorasi Sisaan

#Eksplorasi 
sisaan_aapl.da <- model_aapl.da$residuals 
par(mfrow=c(2,2)) 
qqnorm(sisaan_aapl.da) 
qqline(sisaan_aapl.da, col = "blue", lwd = 2) 
plot(c(1:length(sisaan_aapl.da)),sisaan_aapl.da) 
acf(sisaan_aapl.da) 
pacf(sisaan_aapl.da) 

Berdasarkan plot kuantil-kuantil normal, secara eksplorasi ditunjukkan sisaan tidak menyebar normal ditandai dengan titik titik yang cenderung tidak mengikuti garis \(45^{\circ}\). Kemudian dapat dilihat juga lebar pita sisaan yang cenderung sama menandakan bahwa sisaan memiliki ragam yang homogen. Plot ACF dan PACF sisaan ARIMA(3,1,4) juga tidak signifikan pada lag 13 yang menandakan saling bebas. Kondisi ini akan diuji lebih lanjut dengan uji formal.

2.5.2 Uji Formal

2.5.2.1 Sisaan Menyebar Normal

ks.test(sisaan_aapl.da,"pnorm")  #tak tolak H0 > sisaan menyebar normal
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  sisaan_aapl.da
## D = 0.28207, p-value < 2.2e-16
## alternative hypothesis: two-sided

Selain dengan eksplorasi, asumsi tersebut dapat diuji menggunakan uji formal. Pada tahapan ini uji formal yang digunakan untuk normalitas adalah uji Kolmogorov-Smirnov (KS). Hipotesis pada uji KS adalah sebagai berikut.

\(H_0\) : Sisaan menyebar normal

\(H_1\) : Sisaan tidak menyebar normal

Berdasarkan uji KS tersebut, didapat p-value sebesar \(2.2e-16\) yang kurang dari taraf nyata \(5\%\) sehingga tolak \(H_0\) dan menandakan bahwa sisaan tidak menyebar normal. Hal ini sesuai dengan hasil eksplorasi menggunakan plot kuantil-kuantil normal.

2.5.2.2 Sisaan saling bebas/tidak ada autokorelasi

Box.test(sisaan_aapl.da, type = "Ljung")  #tak tolak H0 > sisaan saling bebas
## 
##  Box-Ljung test
## 
## data:  sisaan_aapl.da
## X-squared = 0.18665, df = 1, p-value = 0.6657

Selanjutnya akan dilakukan uji formal untuk kebebasan sisaan menggunakan uji Ljung-Box. Hipotesis yang digunakan adalah sebagai berikut.

\(H_0\) : Sisaan saling bebas

\(H_1\) : Sisaan tidak tidak saling bebas

Berdasarkan uji Ljung-Box tersebut, didapat p-value sebesar \(0.7336\) yang lebih besar dari taraf nyata \(5\%\) sehingga tak tolak \(H_0\) dan menandakan bahwa sisaan saling bebas. Hal ini sesuai dengan hasil eksplorasi menggunakan plot ACF dan PACF.

2.5.2.3 Sisaan homogen

Box.test((sisaan_aapl.da)^2, type = "Ljung")  #tak tolak H0 > sisaan homogen
## 
##  Box-Ljung test
## 
## data:  (sisaan_aapl.da)^2
## X-squared = 0.43764, df = 1, p-value = 0.5083

Hipotesis yang digunakan untuk uji kehomogenan ragam adalah sebagai berikut.

\(H_0\) : Ragam sisaan homogen

\(H_1\) : Ragam sisaan tidak homogen

Berdasarkan uji Ljung-Box terhadap sisaan kuadrat tersebut, didapat p-value sebesar \(0.01499\) yang lebih kecil dari taraf nyata \(5\%\) sehingga tolak \(H_0\) dan menandakan bahwa ragam sisaan tidak homogen.

#4) Nilai tengah sisaan sama dengan nol 
t.test(sisaan_aapl.da, mu = 0, conf.level = 0.95)  #tak tolak h0 > nilai tengah sisaan sama dengan 0
## 
##  One Sample t-test
## 
## data:  sisaan_aapl.da
## t = 1.44, df = 313, p-value = 0.1509
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -0.0913349  0.5899226
## sample estimates:
## mean of x 
## 0.2492939

Terakhir, dengan uji-t, akan dicek apakah nilai tengah sisaan sama dengan nol. Hipotesis yang diujikan sebagai berikut.

\(H_0\) : nilai tengah sisaan sama dengan 0

\(H_1\) : nilai tengah sisaan tidak sama dengan 0

Berdasarkan uji-ttersebut, didapat p-value sebesar \(0.3043\) yang lebih besar dari taraf nyata \(5\%\) sehingga tak tolak \(H_0\) dan menandakan bahwa nilai tengah sisaan sama dengan nol.

2.6 Peramalan

2.6.1 Ramal

Peramalan dilakukan menggunakan fungsi forecast() . Contoh peramalan berikut ini dilakukan untuk 54 hari ke depan.

#---FORECAST---#
ramalan_aapl.da <- forecast::forecast(model_aapl.da, h = 54) 
ramalan_aapl.da
##     Point Forecast     Lo 80    Hi 80     Lo 95    Hi 95
## 316   0.3995166668 -3.604070 4.403103 -5.723441 6.522474
## 317   1.1515175895 -2.852555 5.155590 -4.972182 7.275218
## 318  -0.2589227636 -4.284018 3.766173 -6.414775 5.896929
## 319  -0.2571109236 -4.301219 3.786997 -6.442041 5.927819
## 320  -1.1449201461 -5.189204 2.899363 -7.330118 5.040278
## 321  -0.3110380254 -4.379921 3.757845 -6.533857 5.911781
## 322  -0.1624324460 -4.233255 3.908390 -6.388218 6.063353
## 323   0.7871034729 -3.283685 4.857892 -5.438630 7.012837
## 324   0.4833450766 -3.604125 4.570815 -5.767901 6.734591
## 325   0.4227081116 -3.664774 4.510190 -5.828556 6.673972
## 326  -0.4452876332 -4.533405 3.642830 -6.697524 5.806949
## 327  -0.5340456228 -4.632821 3.564729 -6.802581 5.734490
## 328  -0.6801266345 -4.780780 3.420527 -6.951535 5.591282
## 329  -0.0318516222 -4.136424 4.072721 -6.309254 6.245550
## 330   0.2605070734 -3.846182 4.367196 -6.020131 6.541146
## 331   0.6142440249 -3.493694 4.722182 -5.668305 6.896793
## 332   0.2653104910 -3.847310 4.377931 -6.024401 6.555022
## 333  -0.0434651525 -4.156245 4.069315 -6.333420 6.246489
## 334  -0.5196572034 -4.633225 3.593911 -6.810817 5.771502
## 335  -0.4687130222 -4.588068 3.650642 -6.768723 5.831297
## 336  -0.2823826586 -4.402586 3.837820 -6.583689 6.018924
## 337   0.1930971044 -3.927111 4.313305 -6.108217 6.494412
## 338   0.3662357562 -3.756215 4.488686 -5.938509 6.670980
## 339   0.3664517156 -3.757218 4.490122 -5.940157 6.673060
## 340   0.0043809710 -4.119826 4.128588 -6.303049 6.311811
## 341  -0.2767090124 -4.401857 3.848439 -6.585578 6.032160
## 342  -0.4514612090 -4.578429 3.675507 -6.763114 5.860192
## 343  -0.2699997366 -4.399197 3.859197 -6.585062 6.045062
## 344  -0.0005953686 -4.129784 4.128593 -6.315644 6.314453
## 345   0.2807150603 -3.848734 4.410164 -6.034732 6.596162
## 346   0.2874026162 -3.843506 4.418311 -6.030277 6.605082
## 347   0.1190916736 -4.012113 4.250296 -6.199040 6.437223
## 348  -0.1770088503 -4.308263 3.954245 -6.495216 6.141199
## 349  -0.3265080179 -4.459180 3.806164 -6.646884 5.993868
## 350  -0.2990791445 -4.433052 3.834894 -6.621445 6.023287
## 351  -0.0709531502 -4.205338 4.063431 -6.393948 6.252042
## 352   0.1448557087 -3.989585 4.279296 -6.178225 6.467937
## 353   0.2467756763 -3.888198 4.381749 -6.077121 6.570672
## 354   0.1365931825 -3.998864 4.272050 -6.188042 6.461229
## 355  -0.0652291922 -4.200686 4.070228 -6.389865 6.259406
## 356  -0.2470793891 -4.383038 3.888879 -6.572482 6.078323
## 357  -0.2624993753 -4.399574 3.874576 -6.589610 6.064611
## 358  -0.1349460657 -4.272465 4.002573 -6.462735 6.192843
## 359   0.0615023836 -4.075982 4.198987 -6.266235 6.389239
## 360   0.1727811293 -3.964951 4.310513 -6.155333 6.500896
## 361   0.1459889272 -3.992040 4.284018 -6.182580 6.474558
## 362  -0.0063571203 -4.144408 4.131694 -6.334960 6.322245
## 363  -0.1615612646 -4.299825 3.976703 -6.490490 6.167367
## 364  -0.2267989081 -4.365707 3.912109 -6.556712 6.103114
## 365  -0.1542223057 -4.293647 3.985203 -6.484926 6.176482
## 366  -0.0100953954 -4.149546 4.129355 -6.340838 6.320648
## 367   0.1123611564 -4.027117 4.251840 -6.218425 6.443147
## 368   0.1256300136 -4.014038 4.265298 -6.205445 6.456705
## 369   0.0340088081 -4.105697 4.173715 -6.297125 6.365143

2.6.2 Plot

data.ramalan_aapl.da <- ramalan_aapl.da$mean
plot(ramalan_aapl.da, col = "lightskyblue4", xlab="Periode (Hari)", lwd = 2)

Berdasarkan hasil plot ramalan di atas, dapat dilihat bahwa ramalan ARIMA(4,1,5) cenderung stabil hingga akhir periode. Selanjutnya, dapat dicari nilai akurasi antara hasil ramalan dengan data uji sebagai berikut.

pt_1 <- train_aapl.ts[length(train_aapl.ts)] #nilai akhir data latih
hasil.forc.Diff <- data.ramalan_aapl.da
hasil <- diffinv(hasil.forc.Diff, differences = 1) + pt_1
#has.1 sama hasilnta dengan: cumsum(c(pt_1,hasil.forc.Diff))
ts.plot(train_aapl.ts,hasil, xlab="Periode (Hari)", 
        col = "lightskyblue4", lwd = 3,
        ylab="Saham Harga (USD)",
        main="Plot Ramalan Saham Apple")

Dapat dilihat bahwa rata-rata harga saham Apple diramalkan akan terus menurun setiap periodenya.

2.6.3 Perbandingan

perbandingan_aapl.da <- matrix(data=c(head(test_aapl.ts, n=54), hasil[-1]),
                     nrow = 54, ncol = 2)
colnames(perbandingan_aapl.da) <- c("Aktual","Hasil Forecast")
datatable(perbandingan_aapl.da, filter = 'top', 
          options = list(pageLength = 5))
akurasi.aapl <- accuracy(ts(hasil[-1]), head(test_aapl.ts, n=54)) %>%
  as.data.frame() %>%
  cbind(Model = ramalan_aapl.da[["method"]]) %>% 
  relocate(Model, .before = 1)
row.names(akurasi.aapl) <- "AAPL"
akurasi.aapl
##             Model        ME     RMSE      MAE       MPE     MAPE      ACF1
## AAPL ARIMA(3,1,4) 0.8812767 6.440549 5.449248 0.3749416 3.284005 0.8339422
##      Theil's U
## AAPL  1.932592

Didapatkan nilai MAPE sebesar \(3.320077\%\) (kurang dari \(10\%\)) yang menandakan bahwa hasil peramalan dari model ARIMA(3,1,4) sudah sangat baik.

3 Amazon

3.1 Uji Stasioner Data

3.1.1 Plot ACF

acf(train_amzn.ts)

Berdasarkan plot ACF, terlihat bahwa plot ACF data train menurun secara perlahan (tails of slowly). Hal ini juga menjadi indikasi bahwa data tidak stasioner dalam rataan dan tidak membentuk gelombang sinus.

3.1.2 Uji ADF

tseries::adf.test(train_amzn.ts)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  train_amzn.ts
## Dickey-Fuller = -2.6387, Lag order = 6, p-value = 0.3071
## alternative hypothesis: stationary

\(H_0\) : Data tidak stasioner dalam rataan

\(H_1\) : Data stasioner dalam rataan

Berdasarkan uji ADF tersebut, didapat p-value sebesar \(0.3071\) yang lebih besar dari taraf nyata \(5\%\) sehingga tak tolak \(H_0\) dan menandakan bahwa data tidak stasioner dalam rataan. Hal ini sesuai dengan hasil eksplorasi menggunakan plot time series dan plot ACF, sehingga ketidakstasioneran model kedepannya harus ditangani.

3.1.3 Plot Box-Cox

index <- seq(1:nrow(amzn))
bc = boxcox(amzn.ts~index, lambda = seq(-2, 4, by=0.01))

#Nilai Rounded Lambda
lambda_amzn <- bc$x[which.max(bc$y)]
#SK
sk_amzn <- bc$x[bc$y > max(bc$y) - 1/2 * qchisq(.95,1)]
cat(" Lambda :", lambda_amzn,
    "\n\n Selang Kepercyaan 95% \n",
    "Batas Bawah :", min(sk_amzn), "\n Batas Bawah :", max(sk_amzn) )
##  Lambda : 0.21 
## 
##  Selang Kepercyaan 95% 
##  Batas Bawah : -0.33 
##  Batas Bawah : 0.74

Gambar di atas menunjukkan nilai rounded value (\(\lambda\)) optimum sebesar \(0.21\) dan pada selang kepercayaan \(95\%\) nilai memiliki batas bawah \(0\) dan batas atas \(0.74\). Selang tersebut tidak memuat nilai satu sehingga dapat dikatakan bahwa data saham amazon tidak stasioner dalam ragam.

3.1.4 Penanganan Ketidakstasioneran Data

train_amzn.diff <- diff(train_amzn.ts, differences = 1) 
plot.ts(train_amzn.diff, lty=1, xlab="Periode (Hari)", 
        col = "orange2", lwd = 3.5,
        main="Plot Difference Saham Amazon")

Berdasarkan plot data deret waktu, terlihat bahwa data sudah stasioner dalam rataan ditandai dengan data bergerak pada nilai tengah tertentu (tidak terdapat trend ataupun musiman pada data).

3.2 Uji Ulang

3.2.1 Plot ACF

acf(train_amzn.diff)

Berdasarkan plot tersebut, terlihat bahwa plot ACF cuts off pada lag ke 13. Sejalan dengan penanganannya, data sudah stasioner dalam rataan dan ketidakstasioneran data telah berhasil tertangani.

3.2.2 Uji ADF

tseries::adf.test(train_amzn.diff)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  train_amzn.diff
## Dickey-Fuller = -6.515, Lag order = 6, p-value = 0.01
## alternative hypothesis: stationary

\(H_0\) : Data tidak stasioner dalam rataan

\(H_1\) : Data stasioner dalam rataan

Berdasarkan uji ADF tersebut, didapat p-value sebesar \(0.01\) yang lebih kecil dari taraf nyata \(5\%\) sehingga tolak \(H_0\) atau data stasioner dalam rataan. Hal ini sesuai dengan hasil eksplorasi menggunakan plot time series dan plot ACF, sehingga dalam hal ini ketidakstasioneran data sudah berhasil ditangani dan dapat dilanjutkan ke pemodelan.

3.3 Identifikasi Model

3.3.1 Plot ACF

acf(train_amzn.diff)

Berdasarkan plot tersebut, terlihat bahwa plot ACF cenderung cuts off pada lag ke 13.

3.3.2 PACF

pacf(train_amzn.diff)

Berdasarkan plot tersebut, terlihat bahwa plot PACF cenderung cuts off pada lag ke 13 dan 15.

3.3.3 Plot EACF

eacf(train_amzn.diff)
## AR/MA
##   0 1 2 3 4 5 6 7 8 9 10 11 12 13
## 0 o o o o o o o o o o o  o  x  o 
## 1 x o o o o o o o o o o  o  x  o 
## 2 o x o o o o o o o o o  o  o  o 
## 3 x x x o o o o o o o o  o  o  o 
## 4 x x x x o o o o o o o  o  o  o 
## 5 x x o x o o o o o o o  o  o  o 
## 6 x o o x o x o o o o o  o  o  o 
## 7 x o x x o x o o o o o  o  o  o

Identifikasi model menggunakan plot EACF dilakukan dengan melihat titik sudut kiri segitiga pada pola segitiga nol atas (pola mariks segitiga bawah).

Dalam hal ini model tentatif yang terbentuk adalah ARIMA(0,1,1), ARIMA(1,1,1), ARIMA(2,1,2), ARIMA(3,1,3), dst..

3.4 Pendugaan Parameter Model Tentatif

model_tentatif(train_amzn.diff, p_max = 6, d = 1, q_max = 12)
## AR/MA
##   0 1 2 3 4 5 6 7 8 9 10 11 12 13
## 0 o o o o o o o o o o o  o  x  o 
## 1 x o o o o o o o o o o  o  x  o 
## 2 o x o o o o o o o o o  o  o  o 
## 3 x x x o o o o o o o o  o  o  o 
## 4 x x x x o o o o o o o  o  o  o 
## 5 x x o x o o o o o o o  o  o  o 
## 6 x o o x o x o o o o o  o  o  o 
## 7 x o x x o x o o o o o  o  o  o 
## 
## Model ARIMA dengan AIC terkecil:
## Series: data 
## ARIMA(4,1,5) 
## 
## Coefficients:
##           ar1     ar2      ar3      ar4      ma1      ma2     ma3     ma4
##       -0.2750  0.4927  -0.2505  -0.8488  -0.6975  -0.7685  0.7276  0.7147
## s.e.   0.0519  0.0554   0.0493   0.0482   0.0348   0.0276  0.0424  0.0297
##           ma5
##       -0.9762
## s.e.   0.0317
## 
## sigma^2 = 13.22:  log likelihood = -849.02
## AIC=1718.04   AICc=1718.77   BIC=1755.5

Berdasarkan pendugaan parameter di atas, nilai AIC terkecil \(1718.04\) dimiliki oleh model ARIMA(4,1,5) dan seluruh parameternya signifikan sehingga model yang dipilih adalah model ARIMA(4,1,5).

model_amzn.da <- Arima(train_amzn.diff, order=c(4,1,5), method="ML")

3.5 Analisis Sisaan

Model terbaik hasil identifikasi kemudian dicek asumsi sisaannya. Sisaan model ARIMA harus memenuhi asumsi normalitas, kebebasan sisaan, dan kehomogenan ragam. Diagnostik model dilakukan secara eksplorasi dan uji formal.

3.5.1 Eksplorasi Sisaan

#Eksplorasi 
sisaan_amzn.da <- model_amzn.da$residuals 
par(mfrow=c(2,2)) 
qqnorm(sisaan_amzn.da) 
qqline(sisaan_amzn.da, col = "blue", lwd = 2) 
plot(c(1:length(sisaan_amzn.da)),sisaan_amzn.da) 
acf(sisaan_amzn.da) 
pacf(sisaan_amzn.da) 

Berdasarkan plot kuantil-kuantil normal, secara eksplorasi ditunjukkan sisaan tidak menyebar normal ditandai dengan titik titik yang cenderung tidak mengikuti garis \(45^{\circ}\). Kemudian dapat dilihat juga lebar pita sisaan yang cenderung sama menandakan bahwa sisaan memiliki ragam yang homogen. Plot ACF dan PACF sisaan ARIMA(4,1,5) juga tidak signifikan pada lag 13 yang menandakan saling bebas. Kondisi ini akan diuji lebih lanjut dengan uji formal.

3.5.2 Uji Formal

3.5.2.1 Sisaan Menyebar Normal

ks.test(sisaan_amzn.da,"pnorm")  #tak tolak H0 > sisaan menyebar normal
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  sisaan_amzn.da
## D = 0.27186, p-value < 2.2e-16
## alternative hypothesis: two-sided

Selain dengan eksplorasi, asumsi tersebut dapat diuji menggunakan uji formal. Pada tahapan ini uji formal yang digunakan untuk normalitas adalah uji Kolmogorov-Smirnov (KS). Hipotesis pada uji KS adalah sebagai berikut.

\(H_0\) : Sisaan menyebar normal

\(H_1\) : Sisaan tidak menyebar normal

Berdasarkan uji KS tersebut, didapat p-value sebesar \(2.2e-16\) yang kurang dari taraf nyata \(5\%\) sehingga tolak \(H_0\) dan menandakan bahwa sisaan tidak menyebar normal. Hal ini sesuai dengan hasil eksplorasi menggunakan plot kuantil-kuantil normal.

3.5.2.2 Sisaan saling bebas/tidak ada autokorelasi

Box.test(sisaan_amzn.da, type = "Ljung")  #tak tolak H0 > sisaan saling bebas
## 
##  Box-Ljung test
## 
## data:  sisaan_amzn.da
## X-squared = 0.11582, df = 1, p-value = 0.7336

Selanjutnya akan dilakukan uji formal untuk kebebasan sisaan menggunakan uji Ljung-Box. Hipotesis yang digunakan adalah sebagai berikut.

\(H_0\) : Sisaan saling bebas

\(H_1\) : Sisaan tidak tidak saling bebas

Berdasarkan uji Ljung-Box tersebut, didapat p-value sebesar \(0.7336\) yang lebih besar dari taraf nyata \(5\%\) sehingga tak tolak \(H_0\) dan menandakan bahwa sisaan saling bebas. Hal ini sesuai dengan hasil eksplorasi menggunakan plot ACF dan PACF.

3.5.2.3 Sisaan homogen

Box.test((sisaan_amzn.da)^2, type = "Ljung")  #tak tolak H0 > sisaan homogen
## 
##  Box-Ljung test
## 
## data:  (sisaan_amzn.da)^2
## X-squared = 5.9174, df = 1, p-value = 0.01499

Hipotesis yang digunakan untuk uji kehomogenan ragam adalah sebagai berikut.

\(H_0\) : Ragam sisaan homogen

\(H_1\) : Ragam sisaan tidak homogen

Berdasarkan uji Ljung-Box terhadap sisaan kuadrat tersebut, didapat p-value sebesar \(0.01499\) yang lebih kecil dari taraf nyata \(5\%\) sehingga tolak \(H_0\) dan menandakan bahwa ragam sisaan tidak homogen.

#4) Nilai tengah sisaan sama dengan nol 
t.test(sisaan_amzn.da, mu = 0, conf.level = 0.95)  #tak tolak h0 > nilai tengah sisaan sama dengan 0
## 
##  One Sample t-test
## 
## data:  sisaan_amzn.da
## t = 1.0289, df = 313, p-value = 0.3043
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -0.1895198  0.6049718
## sample estimates:
## mean of x 
##  0.207726

Terakhir, dengan uji-t, akan dicek apakah nilai tengah sisaan sama dengan nol. Hipotesis yang diujikan sebagai berikut.

\(H_0\) : nilai tengah sisaan sama dengan 0

\(H_1\) : nilai tengah sisaan tidak sama dengan 0

Berdasarkan uji-ttersebut, didapat p-value sebesar \(0.3043\) yang lebih besar dari taraf nyata \(5\%\) sehingga tak tolak \(H_0\) dan menandakan bahwa nilai tengah sisaan sama dengan nol.

3.6 Peramalan

3.6.1 Ramal

Peramalan dilakukan menggunakan fungsi forecast() . Contoh peramalan berikut ini dilakukan untuk 54 hari ke depan.

#---FORECAST---#
ramalan_amzn.da <- forecast::forecast(model_amzn.da, h = 54) 
ramalan_amzn.da
##     Point Forecast     Lo 80    Hi 80     Lo 95    Hi 95
## 316    0.251247616 -4.429551 4.932046 -6.907416 7.409911
## 317   -0.635499219 -5.317692 4.046694 -7.796295 6.525297
## 318   -0.128136086 -4.811768 4.555496 -7.291132 7.034860
## 319   -0.637500928 -5.322216 4.047214 -7.802154 6.527152
## 320   -0.342710902 -5.063782 4.378360 -7.562966 6.877544
## 321   -0.049140884 -4.774811 4.676529 -7.276430 7.178148
## 322   -0.287710304 -5.019938 4.444518 -7.525028 6.949608
## 323    0.281044764 -4.466269 5.028359 -6.979345 7.541435
## 324   -0.316677265 -5.067468 4.434114 -7.582385 6.949031
## 325   -0.061508105 -4.812310 4.689294 -7.327233 7.204217
## 326   -0.366134987 -5.120338 4.388068 -7.637061 6.904791
## 327   -0.489678815 -5.265427 4.286069 -7.793555 6.814198
## 328   -0.162341996 -4.938168 4.613484 -7.466337 7.141653
## 329   -0.453515624 -5.238579 4.331548 -7.771639 6.864608
## 330    0.077352536 -4.707775 4.862480 -7.240868 7.395573
## 331   -0.189234844 -4.978144 4.599674 -7.513239 7.134770
## 332   -0.059287005 -4.848233 4.729659 -7.383348 7.264774
## 333   -0.112195459 -4.911606 4.687215 -7.452261 7.227870
## 334   -0.417452850 -5.220890 4.385984 -7.763675 6.928770
## 335   -0.165832430 -4.969314 4.637649 -7.512124 7.180459
## 336   -0.482471552 -5.289866 4.324922 -7.834746 6.869803
## 337   -0.150044849 -4.961043 4.660953 -7.507831 7.207742
## 338   -0.201391612 -5.013104 4.610321 -7.560271 7.157488
## 339   -0.157756598 -4.970828 4.655314 -7.518713 7.203200
## 340   -0.009559831 -4.829433 4.810314 -7.380920 7.361800
## 341   -0.298128259 -5.117989 4.521732 -7.669469 7.073212
## 342   -0.113099695 -4.933293 4.707094 -7.484949 7.258750
## 343   -0.380316300 -5.200505 4.439873 -7.752159 6.991527
## 344   -0.269171794 -5.093856 4.555512 -7.647889 7.109546
## 345   -0.232795206 -5.057484 4.591894 -7.611520 7.145930
## 346   -0.278159695 -5.106216 4.549897 -7.662035 7.105716
## 347   -0.048785922 -4.877877 4.780305 -7.434243 7.336671
## 348   -0.237673732 -5.066763 4.591416 -7.623129 7.147782
## 349   -0.092233925 -4.921490 4.737022 -7.477943 7.293476
## 350   -0.244244807 -5.074458 4.585968 -7.631418 7.142929
## 351   -0.278164151 -5.110081 4.553753 -7.667944 7.111616
## 352   -0.219827055 -5.051774 4.612120 -7.609653 7.169999
## 353   -0.337954461 -5.172515 4.496606 -7.731777 7.055868
## 354   -0.139199035 -4.973824 4.695426 -7.533120 7.254722
## 355   -0.237881636 -5.072455 4.596692 -7.631723 7.155960
## 356   -0.132748260 -4.967361 4.701864 -7.526650 7.261154
## 357   -0.159800685 -4.995847 4.676246 -7.555895 7.236294
## 358   -0.244552162 -5.080853 4.591749 -7.641036 7.151931
## 359   -0.177143600 -5.013653 4.659366 -7.573947 7.219659
## 360   -0.319898868 -5.157021 4.517223 -7.717639 7.077841
## 361   -0.203234163 -5.040907 4.634439 -7.601817 7.195348
## 362   -0.250597764 -5.088260 4.587065 -7.649164 7.147968
## 363   -0.201551981 -5.039892 4.636788 -7.601155 7.198051
## 364   -0.146427083 -4.985241 4.692387 -7.546754 7.253900
## 365   -0.224587443 -5.063421 4.614246 -7.624945 7.175770
## 366   -0.148016428 -4.987041 4.691008 -7.548665 7.252632
## 367   -0.263022213 -5.102007 4.575962 -7.663610 7.137566
## 368   -0.220880184 -5.060234 4.618474 -7.622033 7.180273
## 369   -0.241966723 -5.081293 4.597360 -7.643078 7.159145

3.6.2 Plot

data.ramalan_amzn.da <- ramalan_amzn.da$mean
plot(ramalan_amzn.da, col = "orange2", xlab="Periode (Hari)", lwd = 2.5)

Berdasarkan hasil plot ramalan di atas, dapat dilihat bahwa ramalan ARIMA(4,1,5) cenderung stabil hingga akhir periode. Selanjutnya, dapat dicari nilai akurasi antara hasil ramalan dengan data uji sebagai berikut.

pt_1 <- train_amzn.ts[length(train_amzn.ts)] #nilai akhir data latih
hasil.forc.Diff <- data.ramalan_amzn.da
hasil <- diffinv(hasil.forc.Diff, differences = 1) + pt_1
#has.1 sama hasilnta dengan: cumsum(c(pt_1,hasil.forc.Diff))
ts.plot(train_amzn.ts, hasil, xlab="Periode (Hari)", 
        col = "orange2", lwd = 3,
        ylab="Saham Harga (USD)",
        main="Plot Ramalan Saham Amazon")

Dapat dilihat bahwa rata-rata harga saham amazon diramalkan akan terus menurun setiap periodenya.

3.6.3 Perbandingan

perbandingan_amzn.da <- matrix(data=c(head(test_amzn.ts, n=54), hasil[-1]),
                     nrow = 54, ncol = 2)
colnames(perbandingan_amzn.da) <- c("Aktual","Hasil Forecast")
datatable(perbandingan_amzn.da, filter = 'top', 
          options = list(pageLength = 5))
akurasi.amzn <- accuracy(ts(hasil[-1]), head(test_amzn.ts, n=54)) %>%
  as.data.frame() %>%
  cbind(Model = ramalan_amzn.da[["method"]]) %>% 
  relocate(Model, .before = 1)
row.names(akurasi.amzn) <- "AMZN"
akurasi.amzn
##             Model       ME     RMSE      MAE     MPE     MAPE      ACF1
## AMZN ARIMA(4,1,5) 14.47885 19.11476 14.91738 12.0552 12.49469 0.9509729
##      Theil's U
## AMZN  7.698132

Didapatkan nilai MAPE sebesar \(12.49469\%\) (lebih dari \(10\%\)) yang menandakan bahwa hasil peramalan dari model ARIMA(4,1,5) sudah baik.

4 Google

4.1 Uji Stasioner Data

4.1.1 Plot ACF

acf(train_goog.ts)

Berdasarkan plot ACF, terlihat bahwa plot ACF data train menurun secara perlahan (tails of slowly). Hal ini juga menjadi indikasi bahwa data tidak stasioner dalam rataan dan tidak membentuk gelombang sinus.

4.1.2 Uji ADF

tseries::adf.test(train_goog.ts)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  train_goog.ts
## Dickey-Fuller = -2.2318, Lag order = 6, p-value = 0.4787
## alternative hypothesis: stationary

\(H_0\) : Data tidak stasioner dalam rataan

\(H_1\) : Data stasioner dalam rataan

Berdasarkan uji ADF tersebut, didapat p-value sebesar \(0.3071\) yang lebih besar dari taraf nyata \(5\%\) sehingga tak tolak \(H_0\) dan menandakan bahwa data tidak stasioner dalam rataan. Hal ini sesuai dengan hasil eksplorasi menggunakan plot time series dan plot ACF, sehingga ketidakstasioneran model kedepannya harus ditangani.

4.1.3 Plot Box-Cox

install_load('MASS')
index <- seq(1:nrow(goog))
bc = boxcox(goog.ts~index, lambda = seq(-2, 4, by=0.01))

#Nilai Rounded Lambda
lambda_goog <- bc$x[which.max(bc$y)]
#SK
sk_goog <- bc$x[bc$y > max(bc$y) - 1/2 * qchisq(.95,1)]
cat(" Lambda :", lambda_goog,
    "\n\n Selang Kepercyaan 95% \n",
    "Batas Bawah :", min(sk_goog), "\n Batas Bawah :", max(sk_goog) )
##  Lambda : 0.51 
## 
##  Selang Kepercyaan 95% 
##  Batas Bawah : -0.23 
##  Batas Bawah : 1.25

Gambar di atas menunjukkan nilai rounded value (\(\lambda\)) optimum sebesar \(0.21\) dan pada selang kepercayaan \(95\%\) nilai memiliki batas bawah \(0\) dan batas atas \(0.74\). Selang tersebut tidak memuat nilai satu sehingga dapat dikatakan bahwa data saham amazon tidak stasioner dalam ragam.

4.1.4 Penanganan Ketidakstasioneran Data

train_goog.diff <- diff(train_goog.ts, differences = 1) 
plot.ts(train_goog.diff, lty=1, xlab="Periode (Hari)", 
        col = "gold3", lwd = 3.5,
        main="Plot Difference Saham Google")

Berdasarkan plot data deret waktu, terlihat bahwa data sudah stasioner dalam rataan ditandai dengan data bergerak pada nilai tengah tertentu (tidak terdapat trend ataupun musiman pada data).

4.2 Uji Ulang

4.2.1 Plot ACF

acf(train_goog.diff)

Berdasarkan plot tersebut, terlihat bahwa plot ACF cuts off pada lag ke 13. Sejalan dengan penanganannya, data sudah stasioner dalam rataan dan ketidakstasioneran data telah berhasil tertangani.

4.2.2 Uji ADF

tseries::adf.test(train_goog.diff)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  train_goog.diff
## Dickey-Fuller = -7.859, Lag order = 6, p-value = 0.01
## alternative hypothesis: stationary

\(H_0\) : Data tidak stasioner dalam rataan

\(H_1\) : Data stasioner dalam rataan

Berdasarkan uji ADF tersebut, didapat p-value sebesar \(0.01\) yang lebih kecil dari taraf nyata \(5\%\) sehingga tolak \(H_0\) atau data stasioner dalam rataan. Hal ini sesuai dengan hasil eksplorasi menggunakan plot time series dan plot ACF, sehingga dalam hal ini ketidakstasioneran data sudah berhasil ditangani dan dapat dilanjutkan ke pemodelan.

4.3 Identifikasi Model

4.3.1 Plot ACF

acf(train_goog.diff)

Berdasarkan plot tersebut, terlihat bahwa plot ACF cenderung cuts off pada lag ke 13.

4.3.2 PACF

pacf(train_goog.diff)

Berdasarkan plot tersebut, terlihat bahwa plot PACF cenderung cuts off pada lag ke 13 dan 15.

4.3.3 Plot EACF

install_load('TSA')
eacf(train_goog.diff)
## AR/MA
##   0 1 2 3 4 5 6 7 8 9 10 11 12 13
## 0 o o o o o o o o o o o  o  o  o 
## 1 x o o o o o o o o o o  o  o  o 
## 2 x o o o o o o o o o o  o  o  o 
## 3 x o o o o o o o o o o  o  o  o 
## 4 o x o x o o o o o o o  o  o  o 
## 5 o x x x x o o o o o o  o  o  o 
## 6 x x x x x x o o o o o  o  o  o 
## 7 x x x o o o o o o o o  o  o  o

Identifikasi model menggunakan plot EACF dilakukan dengan melihat titik sudut kiri segitiga pada pola segitiga nol atas (pola mariks segitiga bawah).

Dalam hal ini model tentatif yang terbentuk adalah ARIMA(0,1,1), ARIMA(1,1,1), ARIMA(2,1,2), ARIMA(3,1,3), dst..

4.4 Pendugaan Parameter Model Tentatif

model_tentatif(train_goog.diff, p_max = 6, d = 1, q_max = 12)
## AR/MA
##   0 1 2 3 4 5 6 7 8 9 10 11 12 13
## 0 o o o o o o o o o o o  o  o  o 
## 1 x o o o o o o o o o o  o  o  o 
## 2 x o o o o o o o o o o  o  o  o 
## 3 x o o o o o o o o o o  o  o  o 
## 4 o x o x o o o o o o o  o  o  o 
## 5 o x x x x o o o o o o  o  o  o 
## 6 x x x x x x o o o o o  o  o  o 
## 7 x x x o o o o o o o o  o  o  o 
## 
## Model ARIMA dengan AIC terkecil:
## Series: data 
## ARIMA(0,1,1) 
## 
## Coefficients:
##          ma1
##       -1.000
## s.e.   0.013
## 
## sigma^2 = 7.453:  log likelihood = -760.86
## AIC=1525.72   AICc=1525.76   BIC=1533.21

Berdasarkan pendugaan parameter di atas, nilai AIC terkecil \(1718.04\) dimiliki oleh model ARIMA(0,1,1) dan seluruh parameternya signifikan sehingga model yang dipilih adalah model ARIMA(0,1,1).

model_goog.da <- Arima(train_goog.diff, order=c(0,1,1), method="ML")

4.5 Analisis Sisaan

Model terbaik hasil identifikasi kemudian dicek asumsi sisaannya. Sisaan model ARIMA harus memenuhi asumsi normalitas, kebebasan sisaan, dan kehomogenan ragam. Diagnostik model dilakukan secara eksplorasi dan uji formal.

4.5.1 Eksplorasi Sisaan

#Eksplorasi 
sisaan_goog.da <- model_goog.da$residuals 
par(mfrow=c(2,2)) 
qqnorm(sisaan_goog.da) 
qqline(sisaan_goog.da, col = "blue", lwd = 2) 
plot(c(1:length(sisaan_goog.da)),sisaan_goog.da) 
acf(sisaan_goog.da) 
pacf(sisaan_goog.da) 

Berdasarkan plot kuantil-kuantil normal, secara eksplorasi ditunjukkan sisaan tidak menyebar normal ditandai dengan titik titik yang cenderung tidak mengikuti garis \(45^{\circ}\). Kemudian dapat dilihat juga lebar pita sisaan yang cenderung sama menandakan bahwa sisaan memiliki ragam yang homogen. Plot ACF dan PACF sisaan ARIMA(0,1,1) juga tidak signifikan pada lag 13 yang menandakan saling bebas. Kondisi ini akan diuji lebih lanjut dengan uji formal.

4.5.2 Uji Formal

4.5.2.1 Sisaan Menyebar Normal

ks.test(sisaan_goog.da,"pnorm")  #tak tolak H0 > sisaan menyebar normal
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  sisaan_goog.da
## D = 0.23999, p-value = 4.441e-16
## alternative hypothesis: two-sided

Selain dengan eksplorasi, asumsi tersebut dapat diuji menggunakan uji formal. Pada tahapan ini uji formal yang digunakan untuk normalitas adalah uji Kolmogorov-Smirnov (KS). Hipotesis pada uji KS adalah sebagai berikut.

\(H_0\) : Sisaan menyebar normal

\(H_1\) : Sisaan tidak menyebar normal

Berdasarkan uji KS tersebut, didapat p-value sebesar \(2.2e-16\) yang kurang dari taraf nyata \(5\%\) sehingga tolak \(H_0\) dan menandakan bahwa sisaan tidak menyebar normal. Hal ini sesuai dengan hasil eksplorasi menggunakan plot kuantil-kuantil normal.

4.5.2.2 Sisaan saling bebas/tidak ada autokorelasi

Box.test(sisaan_goog.da, type = "Ljung")  #tak tolak H0 > sisaan saling bebas
## 
##  Box-Ljung test
## 
## data:  sisaan_goog.da
## X-squared = 0.20035, df = 1, p-value = 0.6544

Selanjutnya akan dilakukan uji formal untuk kebebasan sisaan menggunakan uji Ljung-Box. Hipotesis yang digunakan adalah sebagai berikut.

\(H_0\) : Sisaan saling bebas

\(H_1\) : Sisaan tidak tidak saling bebas

Berdasarkan uji Ljung-Box tersebut, didapat p-value sebesar \(0.7336\) yang lebih besar dari taraf nyata \(5\%\) sehingga tak tolak \(H_0\) dan menandakan bahwa sisaan saling bebas. Hal ini sesuai dengan hasil eksplorasi menggunakan plot ACF dan PACF.

4.5.2.3 Sisaan homogen

Box.test((sisaan_goog.da)^2, type = "Ljung")  #tak tolak H0 > sisaan homogen
## 
##  Box-Ljung test
## 
## data:  (sisaan_goog.da)^2
## X-squared = 0.20183, df = 1, p-value = 0.6532

Hipotesis yang digunakan untuk uji kehomogenan ragam adalah sebagai berikut.

\(H_0\) : Ragam sisaan homogen

\(H_1\) : Ragam sisaan tidak homogen

Berdasarkan uji Ljung-Box terhadap sisaan kuadrat tersebut, didapat p-value sebesar \(0.01499\) yang lebih kecil dari taraf nyata \(5\%\) sehingga tolak \(H_0\) dan menandakan bahwa ragam sisaan tidak homogen.

#4) Nilai tengah sisaan sama dengan nol 
t.test(sisaan_goog.da, mu = 0, conf.level = 0.95)  #tak tolak h0 > nilai tengah sisaan sama dengan 0
## 
##  One Sample t-test
## 
## data:  sisaan_goog.da
## t = 1.0217, df = 313, p-value = 0.3077
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -0.1452610  0.4590431
## sample estimates:
## mean of x 
## 0.1568911

Terakhir, dengan uji-t, akan dicek apakah nilai tengah sisaan sama dengan nol. Hipotesis yang diujikan sebagai berikut.

\(H_0\) : nilai tengah sisaan sama dengan 0

\(H_1\) : nilai tengah sisaan tidak sama dengan 0

Berdasarkan uji-ttersebut, didapat p-value sebesar \(0.3043\) yang lebih besar dari taraf nyata \(5\%\) sehingga tak tolak \(H_0\) dan menandakan bahwa nilai tengah sisaan sama dengan nol.

4.6 Peramalan

4.6.1 Ramal

Peramalan dilakukan menggunakan fungsi forecast() . Contoh peramalan berikut ini dilakukan untuk 54 hari ke depan.

#---FORECAST---#
ramalan_goog.da <- forecast::forecast(model_goog.da, h = 54) 
ramalan_goog.da
##     Point Forecast     Lo 80    Hi 80     Lo 95    Hi 95
## 316     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 317     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 318     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 319     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 320     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 321     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 322     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 323     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 324     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 325     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 326     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 327     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 328     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 329     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 330     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 331     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 332     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 333     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 334     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 335     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 336     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 337     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 338     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 339     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 340     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 341     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 342     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 343     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 344     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 345     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 346     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 347     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 348     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 349     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 350     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 351     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 352     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 353     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 354     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 355     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 356     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 357     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 358     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 359     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 360     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 361     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 362     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 363     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 364     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 365     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 366     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 367     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 368     -0.1272436 -3.631566 3.377078 -5.486642 5.232154
## 369     -0.1272436 -3.631566 3.377078 -5.486642 5.232154

4.6.2 Plot

data.ramalan_goog.da <- ramalan_goog.da$mean
plot(ramalan_goog.da, xlab="Periode (Hari)", col = "gold3", lwd = 2.5)

Berdasarkan hasil plot ramalan di atas, dapat dilihat bahwa ramalan ARIMA(0,1,1) cenderung stabil hingga akhir periode. Selanjutnya, dapat dicari nilai akurasi antara hasil ramalan dengan data uji sebagai berikut.

pt_1 <- train_goog.ts[length(train_goog.ts)] #nilai akhir data latih
hasil.forc.Diff <- data.ramalan_goog.da
hasil <- diffinv(hasil.forc.Diff, differences = 1) + pt_1
#has.1 sama hasilnta dengan: cumsum(c(pt_1,hasil.forc.Diff))
ts.plot(train_goog.ts,hasil, xlab="Periode (Hari)", 
        col = "gold3", lwd = 3.5,
        ylab="Saham Harga (USD)",
        main="Plot Ramalan Saham Google")

Dapat dilihat bahwa rata-rata harga saham Google diramalkan akan terus menurun setiap periodenya.

4.6.3 Perbandingan

perbandingan_goog.da <- matrix(data=c(head(test_goog.ts, n=54), hasil[-1]),
                     nrow = 54, ncol = 2)
colnames(perbandingan_goog.da) <- c("Aktual","Hasil Forecast")
datatable(perbandingan_goog.da, filter = 'top', 
          options = list(pageLength = 5))
akurasi.goog <- accuracy(ts(hasil[-1]), head(test_goog.ts, n=54)) %>%
  as.data.frame() %>%
  cbind(Model = ramalan_goog.da[["method"]]) %>% 
  relocate(Model, .before = 1)
row.names(akurasi.goog) <- "GOOG"
akurasi.goog
##             Model       ME     RMSE      MAE      MPE     MAPE      ACF1
## GOOG ARIMA(0,1,1) 13.65429 17.12383 13.65429 11.24534 11.24534 0.9585583
##      Theil's U
## GOOG  8.187703

Didapatkan nilai MAPE sebesar \(11.24534\%\) (lebih dari \(10\%\)) yang menandakan bahwa hasil peramalan dari model ARIMA(0,1,1) sudah baik.

5 META

5.1 Uji Stasioner Data

5.1.1 Plot ACF

acf(train_meta.ts)

Berdasarkan plot ACF, terlihat bahwa plot ACF data train menurun secara perlahan (tails of slowly). Hal ini juga menjadi indikasi bahwa data tidak stasioner dalam rataan dan tidak membentuk gelombang sinus.

5.1.2 Uji ADF

tseries::adf.test(train_meta.ts)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  train_meta.ts
## Dickey-Fuller = -1.8162, Lag order = 6, p-value = 0.6539
## alternative hypothesis: stationary

\(H_0\) : Data tidak stasioner dalam rataan

\(H_1\) : Data stasioner dalam rataan

Berdasarkan uji ADF tersebut, didapat p-value sebesar \(0.3071\) yang lebih besar dari taraf nyata \(5\%\) sehingga tak tolak \(H_0\) dan menandakan bahwa data tidak stasioner dalam rataan. Hal ini sesuai dengan hasil eksplorasi menggunakan plot time series dan plot ACF, sehingga ketidakstasioneran model kedepannya harus ditangani.

5.1.3 Plot Box-Cox

install_load('MASS')
index <- seq(1:nrow(meta))
bc = boxcox(meta.ts~index, lambda = seq(-2, 4, by=0.01))

#Nilai Rounded Lambda
lambda_meta <- bc$x[which.max(bc$y)]
#SK
sk_meta <- bc$x[bc$y > max(bc$y) - 1/2 * qchisq(.95,1)]
cat(" Lambda :", lambda_meta,
    "\n\n Selang Kepercyaan 95% \n",
    "Batas Bawah :", min(sk_meta), "\n Batas Bawah :", max(sk_meta) )
##  Lambda : 0.13 
## 
##  Selang Kepercyaan 95% 
##  Batas Bawah : -0.17 
##  Batas Bawah : 0.42

Gambar di atas menunjukkan nilai rounded value (\(\lambda\)) optimum sebesar \(0.21\) dan pada selang kepercayaan \(95\%\) nilai memiliki batas bawah \(0\) dan batas atas \(0.74\). Selang tersebut tidak memuat nilai satu sehingga dapat dikatakan bahwa data saham amazon tidak stasioner dalam ragam.

5.1.4 Penanganan Ketidakstasioneran Data

train_meta.diff <- diff(train_meta.ts, differences = 1) 
plot.ts(train_meta.diff, lty=1, xlab="Periode (Tahun)", 
        col = "dodgerblue3", lwd = 3.5,
        main="Plot Difference Saham META")

Berdasarkan plot data deret waktu, terlihat bahwa data sudah stasioner dalam rataan ditandai dengan data bergerak pada nilai tengah tertentu (tidak terdapat trend ataupun musiman pada data).

5.2 Uji Ulang

5.2.1 Plot ACF

acf(train_meta.diff)

Berdasarkan plot tersebut, terlihat bahwa plot ACF cuts off pada lag ke 13. Sejalan dengan penanganannya, data sudah stasioner dalam rataan dan ketidakstasioneran data telah berhasil tertangani.

5.2.2 Uji ADF

tseries::adf.test(train_meta.diff)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  train_meta.diff
## Dickey-Fuller = -7.36, Lag order = 6, p-value = 0.01
## alternative hypothesis: stationary

\(H_0\) : Data tidak stasioner dalam rataan

\(H_1\) : Data stasioner dalam rataan

Berdasarkan uji ADF tersebut, didapat p-value sebesar \(0.01\) yang lebih kecil dari taraf nyata \(5\%\) sehingga tolak \(H_0\) atau data stasioner dalam rataan. Hal ini sesuai dengan hasil eksplorasi menggunakan plot time series dan plot ACF, sehingga dalam hal ini ketidakstasioneran data sudah berhasil ditangani dan dapat dilanjutkan ke pemodelan.

5.3 Identifikasi Model

5.3.1 Plot ACF

acf(train_meta.diff)

Berdasarkan plot tersebut, terlihat bahwa plot ACF cenderung cuts off pada lag ke 13.

5.3.2 PACF

pacf(train_meta.diff)

Berdasarkan plot tersebut, terlihat bahwa plot PACF cenderung cuts off pada lag ke 13 dan 15.

5.3.3 Plot EACF

eacf(train_meta.diff)
## AR/MA
##   0 1 2 3 4 5 6 7 8 9 10 11 12 13
## 0 o o o o o o o o o o o  o  o  o 
## 1 x o o o o o o o o o o  o  o  o 
## 2 x x o o o o o o o o o  o  o  o 
## 3 x x x o o o o o o o o  o  o  o 
## 4 x x x o o o o o o o o  o  o  o 
## 5 x x o o o o o o o o o  o  o  o 
## 6 x x x o o x o o o o o  o  o  o 
## 7 x x x o o x x o o o o  o  o  o

Identifikasi model menggunakan plot EACF dilakukan dengan melihat titik sudut kiri segitiga pada pola segitiga nol atas (pola mariks segitiga bawah).

Dalam hal ini model tentatif yang terbentuk adalah ARIMA(0,1,1), ARIMA(1,1,1), ARIMA(2,1,2), ARIMA(3,1,3), dst..

5.4 Pendugaan Parameter Model Tentatif

model_tentatif(train_meta.diff, p_max = 6, d = 1, q_max = 12)
## AR/MA
##   0 1 2 3 4 5 6 7 8 9 10 11 12 13
## 0 o o o o o o o o o o o  o  o  o 
## 1 x o o o o o o o o o o  o  o  o 
## 2 x x o o o o o o o o o  o  o  o 
## 3 x x x o o o o o o o o  o  o  o 
## 4 x x x o o o o o o o o  o  o  o 
## 5 x x o o o o o o o o o  o  o  o 
## 6 x x x o o x o o o o o  o  o  o 
## 7 x x x o o x x o o o o  o  o  o 
## 
## Model ARIMA dengan AIC terkecil:
## Series: data 
## ARIMA(0,1,1) 
## 
## Coefficients:
##           ma1
##       -0.9853
## s.e.   0.0100
## 
## sigma^2 = 62.76:  log likelihood = -1093.2
## AIC=2190.39   AICc=2190.43   BIC=2197.88

Berdasarkan pendugaan parameter di atas, nilai AIC terkecil \(2190.39\) dimiliki oleh model ARIMA(0,1,1) dan seluruh parameternya signifikan sehingga model yang dipilih adalah model ARIMA(0,1,1) .

model_meta.da <- Arima(train_meta.diff, order=c(0,1,1), method="ML")

5.5 Analisis Sisaan

Model terbaik hasil identifikasi kemudian dicek asumsi sisaannya. Sisaan model ARIMA harus memenuhi asumsi normalitas, kebebasan sisaan, dan kehomogenan ragam. Diagnostik model dilakukan secara eksplorasi dan uji formal.

5.5.1 Eksplorasi Sisaan

#Eksplorasi 
sisaan_meta.da <- model_meta.da$residuals 
par(mfrow=c(2,2)) 
qqnorm(sisaan_meta.da) 
qqline(sisaan_meta.da, col = "blue", lwd = 2) 
plot(c(1:length(sisaan_meta.da)),sisaan_meta.da) 
acf(sisaan_meta.da) 
pacf(sisaan_meta.da) 

Berdasarkan plot kuantil-kuantil normal, secara eksplorasi ditunjukkan sisaan tidak menyebar normal ditandai dengan titik titik yang cenderung tidak mengikuti garis \(45^{\circ}\). Kemudian dapat dilihat juga lebar pita sisaan yang cenderung sama menandakan bahwa sisaan memiliki ragam yang homogen. Plot ACF dan PACF sisaan ARIMA(0,1,1) juga tidak signifikan pada lag 13 yang menandakan saling bebas. Kondisi ini akan diuji lebih lanjut dengan uji formal.

5.5.2 Uji Formal

5.5.2.1 Sisaan Menyebar Normal

ks.test(sisaan_meta.da,"pnorm")  #tak tolak H0 > sisaan menyebar normal
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  sisaan_meta.da
## D = 0.38867, p-value < 2.2e-16
## alternative hypothesis: two-sided

Selain dengan eksplorasi, asumsi tersebut dapat diuji menggunakan uji formal. Pada tahapan ini uji formal yang digunakan untuk normalitas adalah uji Kolmogorov-Smirnov (KS). Hipotesis pada uji KS adalah sebagai berikut.

\(H_0\) : Sisaan menyebar normal

\(H_1\) : Sisaan tidak menyebar normal

Berdasarkan uji KS tersebut, didapat p-value sebesar \(2.2e-16\) yang kurang dari taraf nyata \(5\%\) sehingga tolak \(H_0\) dan menandakan bahwa sisaan tidak menyebar normal. Hal ini sesuai dengan hasil eksplorasi menggunakan plot kuantil-kuantil normal.

5.5.2.2 Sisaan saling bebas/tidak ada autokorelasi

Box.test(sisaan_meta.da, type = "Ljung")  #tak tolak H0 > sisaan saling bebas
## 
##  Box-Ljung test
## 
## data:  sisaan_meta.da
## X-squared = 0.6458, df = 1, p-value = 0.4216

Selanjutnya akan dilakukan uji formal untuk kebebasan sisaan menggunakan uji Ljung-Box. Hipotesis yang digunakan adalah sebagai berikut.

\(H_0\) : Sisaan saling bebas

\(H_1\) : Sisaan tidak tidak saling bebas

Berdasarkan uji Ljung-Box tersebut, didapat p-value sebesar \(0.7336\) yang lebih besar dari taraf nyata \(5\%\) sehingga tak tolak \(H_0\) dan menandakan bahwa sisaan saling bebas. Hal ini sesuai dengan hasil eksplorasi menggunakan plot ACF dan PACF.

5.5.2.3 Sisaan homogen

Box.test((sisaan_meta.da)^2, type = "Ljung")  #tak tolak H0 > sisaan homogen
## 
##  Box-Ljung test
## 
## data:  (sisaan_meta.da)^2
## X-squared = 0.034479, df = 1, p-value = 0.8527

Hipotesis yang digunakan untuk uji kehomogenan ragam adalah sebagai berikut.

\(H_0\) : Ragam sisaan homogen

\(H_1\) : Ragam sisaan tidak homogen

Berdasarkan uji Ljung-Box terhadap sisaan kuadrat tersebut, didapat p-value sebesar \(0.01499\) yang lebih kecil dari taraf nyata \(5\%\) sehingga tolak \(H_0\) dan menandakan bahwa ragam sisaan tidak homogen.

#4) Nilai tengah sisaan sama dengan nol 
t.test(sisaan_meta.da, mu = 0, conf.level = 0.95)  #tak tolak h0 > nilai tengah sisaan sama dengan 0
## 
##  One Sample t-test
## 
## data:  sisaan_meta.da
## t = 1.5232, df = 313, p-value = 0.1287
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -0.1976273  1.5523680
## sample estimates:
## mean of x 
## 0.6773703

Terakhir, dengan uji-t, akan dicek apakah nilai tengah sisaan sama dengan nol. Hipotesis yang diujikan sebagai berikut.

\(H_0\) : nilai tengah sisaan sama dengan 0

\(H_1\) : nilai tengah sisaan tidak sama dengan 0

Berdasarkan uji-ttersebut, didapat p-value sebesar \(0.3043\) yang lebih besar dari taraf nyata \(5\%\) sehingga tak tolak \(H_0\) dan menandakan bahwa nilai tengah sisaan sama dengan nol.

5.6 Peramalan

5.6.1 Ramal

Peramalan dilakukan menggunakan fungsi forecast() . Contoh peramalan berikut ini dilakukan untuk 54 hari ke depan.

#---FORECAST---#
ramalan_meta.da <- forecast::forecast(model_meta.da, h = 54) 
ramalan_meta.da
##     Point Forecast     Lo 80    Hi 80     Lo 95    Hi 95
## 316      0.7316728 -9.420903 10.88425 -14.79535 16.25870
## 317      0.7316728 -9.422003 10.88535 -14.79704 16.26038
## 318      0.7316728 -9.423104 10.88645 -14.79872 16.26206
## 319      0.7316728 -9.424204 10.88755 -14.80040 16.26375
## 320      0.7316728 -9.425304 10.88865 -14.80208 16.26543
## 321      0.7316728 -9.426404 10.88975 -14.80376 16.26711
## 322      0.7316728 -9.427503 10.89085 -14.80545 16.26879
## 323      0.7316728 -9.428603 10.89195 -14.80713 16.27047
## 324      0.7316728 -9.429703 10.89305 -14.80881 16.27216
## 325      0.7316728 -9.430802 10.89415 -14.81049 16.27384
## 326      0.7316728 -9.431901 10.89525 -14.81217 16.27552
## 327      0.7316728 -9.433000 10.89635 -14.81385 16.27720
## 328      0.7316728 -9.434099 10.89745 -14.81553 16.27888
## 329      0.7316728 -9.435198 10.89854 -14.81721 16.28056
## 330      0.7316728 -9.436297 10.89964 -14.81890 16.28224
## 331      0.7316728 -9.437396 10.90074 -14.82058 16.28392
## 332      0.7316728 -9.438494 10.90184 -14.82226 16.28560
## 333      0.7316728 -9.439593 10.90294 -14.82394 16.28728
## 334      0.7316728 -9.440691 10.90404 -14.82562 16.28896
## 335      0.7316728 -9.441789 10.90513 -14.82729 16.29064
## 336      0.7316728 -9.442887 10.90623 -14.82897 16.29232
## 337      0.7316728 -9.443985 10.90733 -14.83065 16.29400
## 338      0.7316728 -9.445083 10.90843 -14.83233 16.29568
## 339      0.7316728 -9.446181 10.90953 -14.83401 16.29736
## 340      0.7316728 -9.447278 10.91062 -14.83569 16.29904
## 341      0.7316728 -9.448376 10.91172 -14.83737 16.30071
## 342      0.7316728 -9.449473 10.91282 -14.83905 16.30239
## 343      0.7316728 -9.450570 10.91392 -14.84072 16.30407
## 344      0.7316728 -9.451668 10.91501 -14.84240 16.30575
## 345      0.7316728 -9.452765 10.91611 -14.84408 16.30743
## 346      0.7316728 -9.453862 10.91721 -14.84576 16.30910
## 347      0.7316728 -9.454958 10.91830 -14.84744 16.31078
## 348      0.7316728 -9.456055 10.91940 -14.84911 16.31246
## 349      0.7316728 -9.457152 10.92050 -14.85079 16.31414
## 350      0.7316728 -9.458248 10.92159 -14.85247 16.31581
## 351      0.7316728 -9.459344 10.92269 -14.85414 16.31749
## 352      0.7316728 -9.460440 10.92379 -14.85582 16.31916
## 353      0.7316728 -9.461536 10.92488 -14.85750 16.32084
## 354      0.7316728 -9.462632 10.92598 -14.85917 16.32252
## 355      0.7316728 -9.463728 10.92707 -14.86085 16.32419
## 356      0.7316728 -9.464824 10.92817 -14.86252 16.32587
## 357      0.7316728 -9.465920 10.92927 -14.86420 16.32754
## 358      0.7316728 -9.467015 10.93036 -14.86587 16.32922
## 359      0.7316728 -9.468110 10.93146 -14.86755 16.33090
## 360      0.7316728 -9.469206 10.93255 -14.86922 16.33257
## 361      0.7316728 -9.470301 10.93365 -14.87090 16.33425
## 362      0.7316728 -9.471396 10.93474 -14.87257 16.33592
## 363      0.7316728 -9.472491 10.93584 -14.87425 16.33759
## 364      0.7316728 -9.473585 10.93693 -14.87592 16.33927
## 365      0.7316728 -9.474680 10.93803 -14.87760 16.34094
## 366      0.7316728 -9.475775 10.93912 -14.87927 16.34262
## 367      0.7316728 -9.476869 10.94021 -14.88094 16.34429
## 368      0.7316728 -9.477963 10.94131 -14.88262 16.34596
## 369      0.7316728 -9.479058 10.94240 -14.88429 16.34764

5.6.2 Plot

data.ramalan_meta.da <- ramalan_meta.da$mean
plot(ramalan_meta.da, xlab="Periode (Tahun)", col = "dodgerblue3", lwd = 2.5)

Berdasarkan hasil plot ramalan di atas, dapat dilihat bahwa ramalan ARIMA(0,1,1) cenderung stabil hingga akhir periode. Selanjutnya, dapat dicari nilai akurasi antara hasil ramalan dengan data uji sebagai berikut.

pt_1 <- train_meta.ts[length(train_meta.ts)] #nilai akhir data latih
hasil.forc.Diff <- data.ramalan_meta.da
hasil <- diffinv(hasil.forc.Diff, differences = 1) + pt_1
#has.1 sama hasilnta dengan: cumsum(c(pt_1,hasil.forc.Diff))
ts.plot(train_meta.ts,hasil, xlab="Periode (Hari)", 
        col = "dodgerblue3", lwd = 3.5,
        ylab="Saham Harga (USD)",
        main="Plot Ramalan Saham META")

Dapat dilihat bahwa rata-rata harga saham META diramalkan akan terus menaik setiap periodenya.

5.6.3 Perbandingan

perbandingan_meta.da <- matrix(data=c(head(test_meta.ts, n=54), hasil[-1]),
                     nrow = 54, ncol = 2)
colnames(perbandingan_meta.da) <- c("Aktual","Hasil Forecast")
datatable(perbandingan_meta.da, filter = 'top', 
          options = list(pageLength = 5))
akurasi.meta <- accuracy(ts(hasil[-1]), head(test_meta.ts, n=54)) %>%
  as.data.frame() %>%
  cbind(Model = ramalan_meta.da[["method"]]) %>% 
  relocate(Model, .before = 1)
row.names(akurasi.meta) <- "META"
akurasi.meta
##             Model       ME     RMSE      MAE      MPE     MAPE      ACF1
## META ARIMA(0,1,1) 7.624181 14.73034 11.46206 2.699937 4.507078 0.8916771
##      Theil's U
## META  2.422415

Didapatkan nilai MAPE sebesar \(4.507078\%\) (kurang dari \(10\%\)) yang menandakan bahwa hasil peramalan dari model ARIMA(0,1,1) sudah sangat baik.

6 Microsoft

6.1 Uji Stasioner Data

6.1.1 Plot ACF

acf(train_msft.ts)

Berdasarkan plot ACF, terlihat bahwa plot ACF data train menurun secara perlahan (tails of slowly). Hal ini juga menjadi indikasi bahwa data tidak stasioner dalam rataan dan tidak membentuk gelombang sinus.

6.1.2 Uji ADF

tseries::adf.test(train_msft.ts)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  train_msft.ts
## Dickey-Fuller = -1.7147, Lag order = 6, p-value = 0.6967
## alternative hypothesis: stationary

\(H_0\) : Data tidak stasioner dalam rataan

\(H_1\) : Data stasioner dalam rataan

Berdasarkan uji ADF tersebut, didapat p-value sebesar \(0.3071\) yang lebih besar dari taraf nyata \(5\%\) sehingga tak tolak \(H_0\) dan menandakan bahwa data tidak stasioner dalam rataan. Hal ini sesuai dengan hasil eksplorasi menggunakan plot time series dan plot ACF, sehingga ketidakstasioneran model kedepannya harus ditangani.

6.1.3 Plot Box-Cox

install_load('MASS')
index <- seq(1:nrow(msft))
bc = boxcox(msft.ts~index, lambda = seq(-2, 4, by=0.01))

#Nilai Rounded Lambda
lambda_msft <- bc$x[which.max(bc$y)]
#SK
sk_msft <- bc$x[bc$y > max(bc$y) - 1/2 * qchisq(.95,1)]
cat(" Lambda :", lambda_msft,
    "\n\n Selang Kepercyaan 95% \n",
    "Batas Bawah :", min(sk_msft), "\n Batas Bawah :", max(sk_msft) )
##  Lambda : -0.92 
## 
##  Selang Kepercyaan 95% 
##  Batas Bawah : -1.8 
##  Batas Bawah : -0.03

Gambar di atas menunjukkan nilai rounded value (\(\lambda\)) optimum sebesar \(0.21\) dan pada selang kepercayaan \(95\%\) nilai memiliki batas bawah \(0\) dan batas atas \(0.74\). Selang tersebut tidak memuat nilai satu sehingga dapat dikatakan bahwa data saham amazon tidak stasioner dalam ragam.

6.1.4 Penanganan Ketidakstasioneran Data

train_msft.diff <- diff(train_msft.ts, differences = 1) 
plot.ts(train_msft.diff, lty=1, xlab="Periode (Tahun)", 
        col = "deepskyblue2", lwd = 3.5,
        main="Plot Difference Saham Microsoft")

Berdasarkan plot data deret waktu, terlihat bahwa data sudah stasioner dalam rataan ditandai dengan data bergerak pada nilai tengah tertentu (tidak terdapat trend ataupun musiman pada data).

6.2 Uji Ulang

6.2.1 Plot ACF

acf(train_msft.diff)

Berdasarkan plot tersebut, terlihat bahwa plot ACF cuts off pada lag ke 13. Sejalan dengan penanganannya, data sudah stasioner dalam rataan dan ketidakstasioneran data telah berhasil tertangani.

6.2.2 Uji ADF

tseries::adf.test(train_msft.diff)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  train_msft.diff
## Dickey-Fuller = -7.044, Lag order = 6, p-value = 0.01
## alternative hypothesis: stationary

\(H_0\) : Data tidak stasioner dalam rataan

\(H_1\) : Data stasioner dalam rataan

Berdasarkan uji ADF tersebut, didapat p-value sebesar \(0.01\) yang lebih kecil dari taraf nyata \(5\%\) sehingga tolak \(H_0\) atau data stasioner dalam rataan. Hal ini sesuai dengan hasil eksplorasi menggunakan plot time series dan plot ACF, sehingga dalam hal ini ketidakstasioneran data sudah berhasil ditangani dan dapat dilanjutkan ke pemodelan.

6.3 Identifikasi Model

6.3.1 Plot ACF

acf(train_msft.diff)

Berdasarkan plot tersebut, terlihat bahwa plot ACF cenderung cuts off pada lag ke 13.

6.3.2 PACF

pacf(train_msft.diff)

Berdasarkan plot tersebut, terlihat bahwa plot PACF cenderung cuts off pada lag ke 13 dan 15.

6.3.3 Plot EACF

install_load('TSA')
eacf(train_msft.diff)
## AR/MA
##   0 1 2 3 4 5 6 7 8 9 10 11 12 13
## 0 o o o o o o o o o o o  o  o  o 
## 1 o o o o o o o o o o o  o  o  o 
## 2 x x o o o o o o o o o  o  o  o 
## 3 x x x o o o o o o o o  o  o  o 
## 4 x x o x o o o o o o o  o  o  o 
## 5 x x o x x o o o o o o  o  o  o 
## 6 x x x o x o o o o o o  o  o  o 
## 7 x x x o x o o o o o o  o  o  o

Identifikasi model menggunakan plot EACF dilakukan dengan melihat titik sudut kiri segitiga pada pola segitiga nol atas (pola mariks segitiga bawah).

Dalam hal ini model tentatif yang terbentuk adalah ARIMA(0,1,1), ARIMA(1,1,1), ARIMA(2,1,2), ARIMA(3,1,3), dst..

6.4 Pendugaan Parameter Model Tentatif

model_tentatif(train_msft.diff, p_max = 6, d = 1, q_max = 12)
## AR/MA
##   0 1 2 3 4 5 6 7 8 9 10 11 12 13
## 0 o o o o o o o o o o o  o  o  o 
## 1 o o o o o o o o o o o  o  o  o 
## 2 x x o o o o o o o o o  o  o  o 
## 3 x x x o o o o o o o o  o  o  o 
## 4 x x o x o o o o o o o  o  o  o 
## 5 x x o x x o o o o o o  o  o  o 
## 6 x x x o x o o o o o o  o  o  o 
## 7 x x x o x o o o o o o  o  o  o 
## 
## Model ARIMA dengan AIC terkecil:
## Series: data 
## ARIMA(2,1,3) 
## 
## Coefficients:
##          ar1      ar2      ma1     ma2      ma3
##       0.0868  -0.9752  -1.0458  1.0498  -0.9944
## s.e.  0.0181   0.0167   0.0198  0.0322   0.0315
## 
## sigma^2 = 31.4:  log likelihood = -985.19
## AIC=1982.37   AICc=1982.65   BIC=2004.85

Berdasarkan pendugaan parameter di atas, nilai AIC terkecil \(1982.37\) dimiliki oleh model ARIMA(2,1,3) dan seluruh parameternya signifikan sehingga model yang dipilih adalah model ARIMA(2,1,3).

model_msft.da <- Arima(train_msft.diff, order=c(2,1,3), method="ML")

6.5 Analisis Sisaan

Model terbaik hasil identifikasi kemudian dicek asumsi sisaannya. Sisaan model ARIMA harus memenuhi asumsi normalitas, kebebasan sisaan, dan kehomogenan ragam. Diagnostik model dilakukan secara eksplorasi dan uji formal.

6.5.1 Eksplorasi Sisaan

#Eksplorasi 
sisaan_msft.da <- model_msft.da$residuals 
par(mfrow=c(2,2)) 
qqnorm(sisaan_msft.da) 
qqline(sisaan_msft.da, col = "blue", lwd = 2) 
plot(c(1:length(sisaan_msft.da)),sisaan_msft.da) 
acf(sisaan_msft.da) 
pacf(sisaan_msft.da) 

Berdasarkan plot kuantil-kuantil normal, secara eksplorasi ditunjukkan sisaan tidak menyebar normal ditandai dengan titik titik yang cenderung tidak mengikuti garis \(45^{\circ}\). Kemudian dapat dilihat juga lebar pita sisaan yang cenderung sama menandakan bahwa sisaan memiliki ragam yang homogen. Plot ACF dan PACF sisaan ARIMA(``2,1,3``) juga tidak signifikan pada lag 13 yang menandakan saling bebas. Kondisi ini akan diuji lebih lanjut dengan uji formal.

6.5.2 Uji Formal

6.5.2.1 Sisaan Menyebar Normal

ks.test(sisaan_msft.da,"pnorm")  #tak tolak H0 > sisaan menyebar normal
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  sisaan_msft.da
## D = 0.34997, p-value < 2.2e-16
## alternative hypothesis: two-sided

Selain dengan eksplorasi, asumsi tersebut dapat diuji menggunakan uji formal. Pada tahapan ini uji formal yang digunakan untuk normalitas adalah uji Kolmogorov-Smirnov (KS). Hipotesis pada uji KS adalah sebagai berikut.

\(H_0\) : Sisaan menyebar normal

\(H_1\) : Sisaan tidak menyebar normal

Berdasarkan uji KS tersebut, didapat p-value sebesar \(2.2e-16\) yang kurang dari taraf nyata \(5\%\) sehingga tolak \(H_0\) dan menandakan bahwa sisaan tidak menyebar normal. Hal ini sesuai dengan hasil eksplorasi menggunakan plot kuantil-kuantil normal.

6.5.2.2 Sisaan saling bebas/tidak ada autokorelasi

Box.test(sisaan_msft.da, type = "Ljung")  #tak tolak H0 > sisaan saling bebas
## 
##  Box-Ljung test
## 
## data:  sisaan_msft.da
## X-squared = 0.6198, df = 1, p-value = 0.4311

Selanjutnya akan dilakukan uji formal untuk kebebasan sisaan menggunakan uji Ljung-Box. Hipotesis yang digunakan adalah sebagai berikut.

\(H_0\) : Sisaan saling bebas

\(H_1\) : Sisaan tidak tidak saling bebas

Berdasarkan uji Ljung-Box tersebut, didapat p-value sebesar \(0.7336\) yang lebih besar dari taraf nyata \(5\%\) sehingga tak tolak \(H_0\) dan menandakan bahwa sisaan saling bebas. Hal ini sesuai dengan hasil eksplorasi menggunakan plot ACF dan PACF.

6.5.2.3 Sisaan homogen

Box.test((sisaan_msft.da)^2, type = "Ljung")  #tak tolak H0 > sisaan homogen
## 
##  Box-Ljung test
## 
## data:  (sisaan_msft.da)^2
## X-squared = 0.66346, df = 1, p-value = 0.4153

Hipotesis yang digunakan untuk uji kehomogenan ragam adalah sebagai berikut.

\(H_0\) : Ragam sisaan homogen

\(H_1\) : Ragam sisaan tidak homogen

Berdasarkan uji Ljung-Box terhadap sisaan kuadrat tersebut, didapat p-value sebesar \(0.01499\) yang lebih kecil dari taraf nyata \(5\%\) sehingga tolak \(H_0\) dan menandakan bahwa ragam sisaan tidak homogen.

#4) Nilai tengah sisaan sama dengan nol 
t.test(sisaan_msft.da, mu = 0, conf.level = 0.95)  #tak tolak h0 > nilai tengah sisaan sama dengan 0
## 
##  One Sample t-test
## 
## data:  sisaan_msft.da
## t = 1.6763, df = 313, p-value = 0.09468
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -0.09096971  1.13800932
## sample estimates:
## mean of x 
## 0.5235198

Terakhir, dengan uji-t, akan dicek apakah nilai tengah sisaan sama dengan nol. Hipotesis yang diujikan sebagai berikut.

\(H_0\) : nilai tengah sisaan sama dengan 0

\(H_1\) : nilai tengah sisaan tidak sama dengan 0

Berdasarkan uji-ttersebut, didapat p-value sebesar \(0.3043\) yang lebih besar dari taraf nyata \(5\%\) sehingga tak tolak \(H_0\) dan menandakan bahwa nilai tengah sisaan sama dengan nol.

6.6 Peramalan

6.6.1 Ramal

Peramalan dilakukan menggunakan fungsi forecast() . Contoh peramalan berikut ini dilakukan untuk 54 hari ke depan.

#---FORECAST---#
ramalan_msft.da <- forecast::forecast(model_msft.da, h = 54) 
ramalan_msft.da
##     Point Forecast     Lo 80    Hi 80      Lo 95     Hi 95
## 316    -1.55542003 -8.756031 5.645191 -12.567804  9.456964
## 317     0.34039177 -6.866442 7.547226 -10.681509 11.362293
## 318     1.55926996 -5.650366 8.768906  -9.466917 12.585457
## 319    -0.18367524 -7.396019 7.028669 -11.214004 10.846653
## 320    -1.52353941 -8.737019 5.689940 -12.555604  9.508525
## 321     0.05983637 -7.158226 7.277898 -10.979237 11.098910
## 322     1.50383343 -5.717969 8.725636  -9.540961 12.548627
## 323     0.08510084 -7.138353 7.308555 -10.962219 11.132421
## 324    -1.44615429 -8.671313 5.779005 -12.496082  9.603773
## 325    -0.19554817 -7.423809 7.032713 -11.250219 10.859123
## 326     1.40620705 -5.826540 8.638954  -9.655324 12.467738
## 327     0.32566983 -6.907901 7.559240 -10.737121 11.388461
## 328    -1.33007515 -8.565788 5.905638 -12.396144  9.735993
## 329    -0.42006819 -7.657655 6.817519 -11.489002 10.648866
## 330     1.27352625 -5.969021 8.516073  -9.802994 12.350046
## 331     0.53309874 -6.709726 7.775923 -10.543846 11.610043
## 332    -1.18268829 -8.427902 6.062526 -12.263287  9.897910
## 333    -0.60955423 -7.855715 6.636607 -11.691601 10.472492
## 334     1.11335575 -6.137938 8.364649  -9.976541 12.203252
## 335     0.70397815 -6.547339 7.955296 -10.385955 11.793911
## 336    -1.01166641 -8.265411 6.242078 -12.105311 10.081978
## 337    -0.76134744 -8.015421 6.492726 -11.855496 10.332801
## 338     0.93340840 -6.325677 8.192494 -10.168405 12.035221
## 339     0.83638462 -6.422739 8.095508 -10.265487 11.938256
## 340    -0.82469774 -8.086092 6.436696 -11.930042 10.280646
## 341    -0.87423934 -8.135629 6.387151 -11.979577 10.231098
## 342     0.74128636 -6.524741 8.007314 -10.371144 11.853716
## 343     0.92979942 -6.336497 8.196095 -10.183041 12.042640
## 344    -0.62924062 -7.897500 6.639018 -11.745083 10.486602
## 345    -0.94837137 -8.216525 6.319782 -12.064053 10.167310
## 346     0.54425043 -6.727976 7.816477 -10.577660 11.666161
## 347     0.98499060 -6.287882 8.257863 -10.137909 12.107890
## 348    -0.43230887 -7.706743 6.842125 -11.557595 10.692977
## 349    -0.98510120 -8.259496 6.289294 -12.110328 10.140126
## 350     0.34902242 -6.928764 7.626809 -10.781392 11.479436
## 351     1.00386546 -6.275018 8.282749 -10.128226 12.135956
## 352    -0.24029181 -7.520301 7.039717 -11.374105 10.893521
## 353    -0.98684322 -8.266980 6.293294 -12.120852 10.147165
## 354     0.16162342 -7.121180 7.444427 -10.976463 11.299710
## 355     0.98930096 -6.295051 8.273653 -10.151154 12.129756
## 356    -0.05881131 -7.343879 7.226256 -11.200361 11.082738
## 357    -0.95689084 -8.242289 6.328508 -12.098946 10.185165
## 358    -0.01275016 -7.300113 7.274612 -11.157809 11.132309
## 359     0.94495967 -6.344346 8.234265 -10.203071 12.092991
## 360     0.10738313 -7.182298 7.397065 -11.041223 11.255989
## 361    -0.89922785 -8.189428 6.390973 -12.048628 10.250172
## 362    -0.16981251 -7.461349 7.121724 -11.321255 10.981630
## 363     0.87509837 -6.418674 8.168871 -10.279764 12.029961
## 364     0.25448159 -7.039429 7.548392 -10.900592 11.409555
## 365    -0.81833593 -8.112903 6.476231 -11.974414 10.337742
## 366    -0.30623726 -7.601621 6.989146 -11.463563 10.851089
## 367     0.78437610 -6.513410 8.082162 -10.376624 11.945377
## 368     0.37964463 -6.918157 7.677446 -10.781380 11.540669
## 369    -0.71900482 -8.017531 6.579522 -11.881138 10.443128

6.6.2 Plot

data.ramalan_msft.da <- ramalan_msft.da$mean
plot(ramalan_msft.da, xlab="Periode (Tahun)", col = "deepskyblue2", lwd = 2.5)

Berdasarkan hasil plot ramalan di atas, dapat dilihat bahwa ramalan ARIMA(4,1,5) cenderung stabil hingga akhir periode. Selanjutnya, dapat dicari nilai akurasi antara hasil ramalan dengan data uji sebagai berikut.

pt_1 <- train_msft.ts[length(train_msft.ts)] #nilai akhir data latih
hasil.forc.Diff <- data.ramalan_msft.da
hasil <- diffinv(hasil.forc.Diff, differences = 1) + pt_1
#has.1 sama hasilnta dengan: cumsum(c(pt_1,hasil.forc.Diff))
ts.plot(train_msft.ts,hasil, xlab="Periode (Hari)", 
        ylab="Saham Harga (USD)",
        col = "deepskyblue2", lwd = 3.5,
        main="Plot Ramalan Saham Microsoft")

Dapat dilihat bahwa rata-rata harga saham Microsoft diramalkan akan terus konstan setiap periodenya.

6.6.3 Perbandingan

perbandingan_msft.da <- matrix(data=c(head(test_msft.ts, n=54), hasil[-1]),
                     nrow = 54, ncol = 2)
colnames(perbandingan_msft.da) <- c("Aktual","Hasil Forecast")
datatable(perbandingan_msft.da, filter = 'top', 
          options = list(pageLength = 5))
akurasi.msft <- accuracy(ts(hasil[-1]), head(test_msft.ts, n=54)) %>%
  as.data.frame() %>%
  cbind(Model = ramalan_msft.da[["method"]]) %>% 
  relocate(Model, .before = 1)
row.names(akurasi.msft) <- "MSFT"
akurasi.msft
##             Model       ME     RMSE      MAE      MPE     MAPE      ACF1
## MSFT ARIMA(2,1,3) 24.50196 31.20057 25.45984 7.526155 7.869212 0.9363169
##      Theil's U
## MSFT  5.523046

Didapatkan nilai MAPE sebesar \(7.869212\%\) (kurang dari \(10\%\)) yang menandakan bahwa hasil peramalan dari model ARIMA(``2,1,3``) sudah sangat baik.

7 Netflix

7.1 Uji Stasioner Data

7.1.1 Plot ACF

acf(train_nflx.ts)

Berdasarkan plot ACF, terlihat bahwa plot ACF data train menurun secara perlahan (tails of slowly). Hal ini juga menjadi indikasi bahwa data tidak stasioner dalam rataan dan tidak membentuk gelombang sinus.

7.1.2 Uji ADF

tseries::adf.test(train_nflx.ts)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  train_nflx.ts
## Dickey-Fuller = -2.9406, Lag order = 6, p-value = 0.1799
## alternative hypothesis: stationary

\(H_0\) : Data tidak stasioner dalam rataan

\(H_1\) : Data stasioner dalam rataan

Berdasarkan uji ADF tersebut, didapat p-value sebesar \(0.3071\) yang lebih besar dari taraf nyata \(5\%\) sehingga tak tolak \(H_0\) dan menandakan bahwa data tidak stasioner dalam rataan. Hal ini sesuai dengan hasil eksplorasi menggunakan plot time series dan plot ACF, sehingga ketidakstasioneran model kedepannya harus ditangani.

7.1.3 Plot Box-Cox

install_load('MASS')
index <- seq(1:nrow(nflx))
bc = boxcox(nflx.ts~index, lambda = seq(-2, 4, by=0.01))

#Nilai Rounded Lambda
lambda_nflx <- bc$x[which.max(bc$y)]
#SK
sk_nflx <- bc$x[bc$y > max(bc$y) - 1/2 * qchisq(.95,1)]
cat(" Lambda :", lambda_nflx,
    "\n\n Selang Kepercyaan 95% \n",
    "Batas Bawah :", min(sk_nflx), "\n Batas Bawah :", max(sk_nflx) )
##  Lambda : 0.19 
## 
##  Selang Kepercyaan 95% 
##  Batas Bawah : -0.14 
##  Batas Bawah : 0.51

Gambar di atas menunjukkan nilai rounded value (\(\lambda\)) optimum sebesar \(0.21\) dan pada selang kepercayaan \(95\%\) nilai memiliki batas bawah \(0\) dan batas atas \(0.74\). Selang tersebut tidak memuat nilai satu sehingga dapat dikatakan bahwa data saham amazon tidak stasioner dalam ragam.

7.1.4 Penanganan Ketidakstasioneran Data

train_nflx.diff <- diff(train_nflx.ts, differences = 1) 
plot.ts(train_nflx.diff, lty=1, xlab="Periode (Hari)", 
        col = "firebrick3", lwd = 3.5,
        main="Plot Difference Saham Netflix")

Berdasarkan plot data deret waktu, terlihat bahwa data sudah stasioner dalam rataan ditandai dengan data bergerak pada nilai tengah tertentu (tidak terdapat trend ataupun musiman pada data).

7.2 Uji Ulang

7.2.1 Plot ACF

acf(train_nflx.diff)

Berdasarkan plot tersebut, terlihat bahwa plot ACF cuts off pada lag ke 13. Sejalan dengan penanganannya, data sudah stasioner dalam rataan dan ketidakstasioneran data telah berhasil tertangani.

7.2.2 Uji ADF

tseries::adf.test(train_nflx.diff)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  train_nflx.diff
## Dickey-Fuller = -7.1658, Lag order = 6, p-value = 0.01
## alternative hypothesis: stationary

\(H_0\) : Data tidak stasioner dalam rataan

\(H_1\) : Data stasioner dalam rataan

Berdasarkan uji ADF tersebut, didapat p-value sebesar \(0.01\) yang lebih kecil dari taraf nyata \(5\%\) sehingga tolak \(H_0\) atau data stasioner dalam rataan. Hal ini sesuai dengan hasil eksplorasi menggunakan plot time series dan plot ACF, sehingga dalam hal ini ketidakstasioneran data sudah berhasil ditangani dan dapat dilanjutkan ke pemodelan.

7.3 Identifikasi Model

7.3.1 Plot ACF

acf(train_nflx.diff)

Berdasarkan plot tersebut, terlihat bahwa plot ACF cenderung cuts off pada lag ke 13.

7.3.2 PACF

pacf(train_nflx.diff)

Berdasarkan plot tersebut, terlihat bahwa plot PACF cenderung cuts off pada lag ke 13 dan 15.

7.3.3 Plot EACF

install_load('TSA')
eacf(train_nflx.diff)
## AR/MA
##   0 1 2 3 4 5 6 7 8 9 10 11 12 13
## 0 o o o o o o o o o o o  o  o  o 
## 1 x o o o o o o o o o o  o  o  o 
## 2 x o o o o o o o o o o  o  o  o 
## 3 x x x o o o o o o o o  o  o  o 
## 4 x x o x o o o o o o o  o  o  o 
## 5 x x o o x o o o o o o  o  o  o 
## 6 x x x o x x o o o o o  o  o  o 
## 7 x o x x x x o o o o o  o  o  o

Identifikasi model menggunakan plot EACF dilakukan dengan melihat titik sudut kiri segitiga pada pola segitiga nol atas (pola mariks segitiga bawah).

Dalam hal ini model tentatif yang terbentuk adalah ARIMA(0,1,1), ARIMA(1,1,1), ARIMA(2,1,2), ARIMA(3,1,3), dst..

7.4 Pendugaan Parameter Model Tentatif

model_tentatif(train_nflx.diff, p_max = 6, d = 1, q_max = 12)
## AR/MA
##   0 1 2 3 4 5 6 7 8 9 10 11 12 13
## 0 o o o o o o o o o o o  o  o  o 
## 1 x o o o o o o o o o o  o  o  o 
## 2 x o o o o o o o o o o  o  o  o 
## 3 x x x o o o o o o o o  o  o  o 
## 4 x x o x o o o o o o o  o  o  o 
## 5 x x o o x o o o o o o  o  o  o 
## 6 x x x o x x o o o o o  o  o  o 
## 7 x o x x x x o o o o o  o  o  o 
## 
## Model ARIMA dengan AIC terkecil:
## Series: data 
## ARIMA(5,1,6) 
## 
## Coefficients:
##           ar1     ar2     ar3      ar4      ar5      ma1      ma2      ma3
##       -0.0271  0.1470  0.2160  -0.2798  -0.8085  -0.9046  -0.2252  -0.0958
## s.e.   0.0664  0.0509  0.0434   0.0512   0.0614   0.0596   0.0719   0.0613
##          ma4     ma5      ma6
##       0.4098  0.7705  -0.9166
## s.e.  0.0675  0.0680   0.0489
## 
## sigma^2 = 166.8:  log likelihood = -1244.6
## AIC=2513.2   AICc=2514.24   BIC=2558.16

Berdasarkan pendugaan parameter di atas, nilai AIC terkecil \(1718.04\) dimiliki oleh model ARIMA(5,1,6) dan seluruh parameternya signifikan sehingga model yang dipilih adalah model ARIMA(5,1,6).

model_nflx.da <- Arima(train_nflx.diff, order=c(5,1,6), method="ML")

7.5 Analisis Sisaan

Model terbaik hasil identifikasi kemudian dicek asumsi sisaannya. Sisaan model ARIMA harus memenuhi asumsi normalitas, kebebasan sisaan, dan kehomogenan ragam. Diagnostik model dilakukan secara eksplorasi dan uji formal.

7.5.1 Eksplorasi Sisaan

#Eksplorasi 
sisaan_nflx.da <- model_nflx.da$residuals 
par(mfrow=c(2,2)) 
qqnorm(sisaan_nflx.da) 
qqline(sisaan_nflx.da, col = "blue", lwd = 2) 
plot(c(1:length(sisaan_nflx.da)),sisaan_nflx.da) 
acf(sisaan_nflx.da) 
pacf(sisaan_nflx.da) 

Berdasarkan plot kuantil-kuantil normal, secara eksplorasi ditunjukkan sisaan tidak menyebar normal ditandai dengan titik titik yang cenderung tidak mengikuti garis \(45^{\circ}\). Kemudian dapat dilihat juga lebar pita sisaan yang cenderung sama menandakan bahwa sisaan memiliki ragam yang homogen. Plot ACF dan PACF sisaan ARIMA(5,1,6) juga tidak signifikan pada lag 13 yang menandakan saling bebas. Kondisi ini akan diuji lebih lanjut dengan uji formal.

7.5.2 Uji Formal

7.5.2.1 Sisaan Menyebar Normal

ks.test(sisaan_nflx.da,"pnorm")  #tak tolak H0 > sisaan menyebar normal
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  sisaan_nflx.da
## D = 0.41576, p-value < 2.2e-16
## alternative hypothesis: two-sided

Selain dengan eksplorasi, asumsi tersebut dapat diuji menggunakan uji formal. Pada tahapan ini uji formal yang digunakan untuk normalitas adalah uji Kolmogorov-Smirnov (KS). Hipotesis pada uji KS adalah sebagai berikut.

\(H_0\) : Sisaan menyebar normal

\(H_1\) : Sisaan tidak menyebar normal

Berdasarkan uji KS tersebut, didapat p-value sebesar \(2.2e-16\) yang kurang dari taraf nyata \(5\%\) sehingga tolak \(H_0\) dan menandakan bahwa sisaan tidak menyebar normal. Hal ini sesuai dengan hasil eksplorasi menggunakan plot kuantil-kuantil normal.

7.5.2.2 Sisaan saling bebas/tidak ada autokorelasi

Box.test(sisaan_nflx.da, type = "Ljung")  #tak tolak H0 > sisaan saling bebas
## 
##  Box-Ljung test
## 
## data:  sisaan_nflx.da
## X-squared = 0.027046, df = 1, p-value = 0.8694

Selanjutnya akan dilakukan uji formal untuk kebebasan sisaan menggunakan uji Ljung-Box. Hipotesis yang digunakan adalah sebagai berikut.

\(H_0\) : Sisaan saling bebas

\(H_1\) : Sisaan tidak tidak saling bebas

Berdasarkan uji Ljung-Box tersebut, didapat p-value sebesar \(0.7336\) yang lebih besar dari taraf nyata \(5\%\) sehingga tak tolak \(H_0\) dan menandakan bahwa sisaan saling bebas. Hal ini sesuai dengan hasil eksplorasi menggunakan plot ACF dan PACF.

7.5.2.3 Sisaan homogen

Box.test((sisaan_nflx.da)^2, type = "Ljung")  #tak tolak H0 > sisaan homogen
## 
##  Box-Ljung test
## 
## data:  (sisaan_nflx.da)^2
## X-squared = 0.012265, df = 1, p-value = 0.9118

Hipotesis yang digunakan untuk uji kehomogenan ragam adalah sebagai berikut.

\(H_0\) : Ragam sisaan homogen

\(H_1\) : Ragam sisaan tidak homogen

Berdasarkan uji Ljung-Box terhadap sisaan kuadrat tersebut, didapat p-value sebesar \(0.01499\) yang lebih kecil dari taraf nyata \(5\%\) sehingga tolak \(H_0\) dan menandakan bahwa ragam sisaan tidak homogen.

#4) Nilai tengah sisaan sama dengan nol 
t.test(sisaan_nflx.da, mu = 0, conf.level = 0.95)  #tak tolak h0 > nilai tengah sisaan sama dengan 0
## 
##  One Sample t-test
## 
## data:  sisaan_nflx.da
## t = 1.5979, df = 313, p-value = 0.1111
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -0.2635971  2.5425073
## sample estimates:
## mean of x 
##  1.139455

Terakhir, dengan uji-t, akan dicek apakah nilai tengah sisaan sama dengan nol. Hipotesis yang diujikan sebagai berikut.

\(H_0\) : nilai tengah sisaan sama dengan 0

\(H_1\) : nilai tengah sisaan tidak sama dengan 0

Berdasarkan uji-ttersebut, didapat p-value sebesar \(0.3043\) yang lebih besar dari taraf nyata \(5\%\) sehingga tak tolak \(H_0\) dan menandakan bahwa nilai tengah sisaan sama dengan nol.

7.6 Peramalan

7.6.1 Ramal

Peramalan dilakukan menggunakan fungsi forecast() . Contoh peramalan berikut ini dilakukan untuk 54 hari ke depan.

#---FORECAST---#
ramalan_nflx.da <- forecast::forecast(model_nflx.da, h = 54) 
ramalan_nflx.da
##     Point Forecast     Lo 80    Hi 80     Lo 95    Hi 95
## 316     3.27072247 -13.33972 19.88117 -22.13276 28.67420
## 317     1.32424229 -15.32381 17.97229 -24.13676 26.78524
## 318     0.95232556 -15.69691 17.60156 -24.51048 26.41513
## 319     1.95314145 -14.69602 18.60231 -23.50956 27.41584
## 320     2.02635454 -14.67474 18.72745 -23.51577 27.56848
## 321    -1.25868963 -18.09101 15.57364 -27.00151 24.48413
## 322     0.73505438 -16.10680 17.57691 -25.02234 26.49245
## 323     0.23450140 -16.61423 17.08324 -25.53342 26.00242
## 324    -0.99796293 -17.89614 15.90022 -26.84150 24.84557
## 325     0.25253218 -16.67660 17.18167 -25.63835 26.14341
## 326     2.02746505 -14.91375 18.96868 -23.88188 27.93682
## 327     0.42515671 -16.57389 17.42420 -25.57264 26.42295
## 328     1.74920759 -15.24986 18.74827 -24.24862 27.74704
## 329     2.50763742 -14.50293 19.51820 -23.50777 28.52305
## 330     0.82794241 -16.18502 17.84091 -25.19114 26.84703
## 331     0.28421725 -16.74103 17.30946 -25.75364 26.32208
## 332     1.14075689 -15.89501 18.17653 -24.91321 27.19472
## 333    -0.60793415 -17.67364 16.45777 -26.70768 25.49181
## 334    -0.69522485 -17.79524 16.40479 -26.84745 25.45700
## 335     0.74526349 -16.35590 17.84643 -25.40871 26.89924
## 336     0.51566655 -16.59776 17.62909 -25.65706 26.68839
## 337     0.51165825 -16.63583 17.65915 -25.71316 26.73648
## 338     2.22741521 -14.92429 19.37912 -24.00385 28.45868
## 339     1.79823417 -15.35336 18.94982 -24.43286 28.02933
## 340     0.96083308 -16.19703 18.11869 -25.27985 27.20151
## 341     1.47772305 -15.68241 18.63786 -24.76644 27.72188
## 342     0.77099824 -16.38901 17.93101 -25.47298 27.01497
## 343    -0.58185791 -17.77075 16.60703 -26.86999 25.70628
## 344     0.04385377 -17.14960 17.23730 -26.25126 26.33897
## 345     0.20777759 -16.99179 17.40734 -26.09669 26.51224
## 346    -0.21698893 -17.45437 17.02040 -26.57929 26.14532
## 347     0.90375694 -16.34145 18.14897 -25.47051 27.27803
## 348     1.76507768 -15.48016 19.01032 -24.60924 28.13940
## 349     1.26301775 -15.98966 18.51570 -25.12268 27.64872
## 350     1.63163864 -15.62104 18.88432 -24.75406 28.01734
## 351     1.76365780 -15.49281 19.02013 -24.62784 28.15515
## 352     0.55865238 -16.70106 17.81837 -25.83781 26.95511
## 353     0.13440380 -17.13137 17.40018 -26.27132 26.54013
## 354     0.30000502 -16.96657 17.56658 -26.10694 26.70695
## 355    -0.36209310 -17.64928 16.92509 -26.80056 26.07638
## 356    -0.18096343 -17.49346 17.13153 -26.65814 26.29622
## 357     0.84555781 -16.47066 18.16178 -25.63731 27.32843
## 358     0.99807026 -16.32603 18.32217 -25.49686 27.49300
## 359     1.23538340 -16.09591 18.56668 -25.27055 27.74132
## 360     1.95772015 -15.37440 19.28984 -24.54947 28.46491
## 361     1.57227036 -15.75974 18.90428 -24.93475 28.07930
## 362     0.86751291 -16.46659 18.20162 -25.64272 27.37774
## 363     0.79620756 -16.53779 18.13021 -25.71385 27.30627
## 364     0.21725036 -17.11941 17.55391 -26.29688 26.73138
## 365    -0.40592826 -17.76267 16.95081 -26.95077 26.13892
## 366     0.01929656 -17.34814 17.38673 -26.54190 26.58049
## 367     0.38088846 -16.99604 17.75781 -26.19482 26.95660
## 368     0.51870074 -16.87587 17.91327 -26.08400 27.12140
## 369     1.30247184 -16.09548 18.70042 -25.30540 27.91034

7.6.2 Plot

data.ramalan_nflx.da <- ramalan_nflx.da$mean
plot(ramalan_nflx.da, xlab="Periode (Hari)", col = "firebrick3", lwd = 2.5)

Berdasarkan hasil plot ramalan di atas, dapat dilihat bahwa ramalan ARIMA(5,1,6) cenderung stabil hingga akhir periode. Selanjutnya, dapat dicari nilai akurasi antara hasil ramalan dengan data uji sebagai berikut.

pt_1 <- train_nflx.ts[length(train_nflx.ts)] #nilai akhir data latih
hasil.forc.Diff <- data.ramalan_nflx.da
hasil <- diffinv(hasil.forc.Diff, differences = 1) + pt_1
#has.1 sama hasilnta dengan: cumsum(c(pt_1,hasil.forc.Diff))
ts.plot(train_nflx.ts,hasil, ylab="Saham Harga (USD)", 
        xlab="Periode (Hari)", 
        col = "firebrick3", lwd = 3.5,
        main="Plot Ramalan Saham Netflix")

Dapat dilihat bahwa rata-rata harga saham Netfilx diramalkan akan terus menaik setiap periodenya.

7.6.3 Perbandingan

perbandingan_nflx.da <- matrix(data=c(head(test_nflx.ts, n=54), hasil[-1]),
                     nrow = 54, ncol = 2)
colnames(perbandingan_nflx.da) <- c("Aktual","Hasil Forecast")
datatable(perbandingan_nflx.da, filter = 'top', 
          options = list(pageLength = 5))
akurasi.nflx <- accuracy(ts(hasil[-1]), head(test_nflx.ts, n=54)) %>%
  as.data.frame() %>%
  cbind(Model = ramalan_nflx.da[["method"]]) %>% 
  relocate(Model, .before = 1)
row.names(akurasi.nflx) <- "NFLX"
akurasi.nflx
##             Model        ME     RMSE      MAE       MPE     MAPE      ACF1
## NFLX ARIMA(5,1,6) -9.248861 31.23494 28.06946 -3.406751 7.852942 0.9431005
##      Theil's U
## NFLX  3.874811

Didapatkan nilai MAPE sebesar \(7.852942\%\) (kurang dari \(10\%\)) yang menandakan bahwa hasil peramalan dari model ARIMA(5,1,6) sudah sangat baik.

8 NVIDIA

8.1 Uji Stasioner Data

8.1.1 Plot ACF

acf(train_nvda.ts)

Berdasarkan plot ACF, terlihat bahwa plot ACF data train menurun secara perlahan (tails of slowly). Hal ini juga menjadi indikasi bahwa data tidak stasioner dalam rataan dan tidak membentuk gelombang sinus.

8.1.2 Uji ADF

tseries::adf.test(train_nvda.ts)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  train_nvda.ts
## Dickey-Fuller = -0.81763, Lag order = 6, p-value = 0.9594
## alternative hypothesis: stationary

\(H_0\) : Data tidak stasioner dalam rataan

\(H_1\) : Data stasioner dalam rataan

Berdasarkan uji ADF tersebut, didapat p-value sebesar \(0.3071\) yang lebih besar dari taraf nyata \(5\%\) sehingga tak tolak \(H_0\) dan menandakan bahwa data tidak stasioner dalam rataan. Hal ini sesuai dengan hasil eksplorasi menggunakan plot time series dan plot ACF, sehingga ketidakstasioneran model kedepannya harus ditangani.

8.1.3 Plot Box-Cox

install_load('MASS')
index <- seq(1:nrow(nvda))
bc = boxcox(nvda.ts~index, lambda = seq(-2, 4, by=0.01))

#Nilai Rounded Lambda
lambda_nvda <- bc$x[which.max(bc$y)]
#SK
sk_nvda <- bc$x[bc$y > max(bc$y) - 1/2 * qchisq(.95,1)]
cat(" Lambda :", lambda_nvda,
    "\n\n Selang Kepercyaan 95% \n",
    "Batas Bawah :", min(sk_nvda), "\n Batas Bawah :", max(sk_nvda) )
##  Lambda : -0.33 
## 
##  Selang Kepercyaan 95% 
##  Batas Bawah : -0.6 
##  Batas Bawah : -0.05

Gambar di atas menunjukkan nilai rounded value (\(\lambda\)) optimum sebesar \(0.21\) dan pada selang kepercayaan \(95\%\) nilai memiliki batas bawah \(0\) dan batas atas \(0.74\). Selang tersebut tidak memuat nilai satu sehingga dapat dikatakan bahwa data saham amazon tidak stasioner dalam ragam.

8.1.4 Penanganan Ketidakstasioneran Data

train_nvda.diff <- diff(train_nvda.ts, differences = 1) 
plot.ts(train_nvda.diff, lty=1, xlab="Periode (Tahun)", 
        col = "green4", lwd = 4,
        main="Plot Difference Saham Amazon")

Berdasarkan plot data deret waktu, terlihat bahwa data sudah stasioner dalam rataan ditandai dengan data bergerak pada nilai tengah tertentu (tidak terdapat trend ataupun musiman pada data).

8.2 Uji Ulang

8.2.1 Plot ACF

acf(train_nvda.diff)

Berdasarkan plot tersebut, terlihat bahwa plot ACF cuts off pada lag ke 13. Sejalan dengan penanganannya, data sudah stasioner dalam rataan dan ketidakstasioneran data telah berhasil tertangani.

8.2.2 Uji ADF

tseries::adf.test(train_nvda.diff)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  train_nvda.diff
## Dickey-Fuller = -5.8703, Lag order = 6, p-value = 0.01
## alternative hypothesis: stationary

\(H_0\) : Data tidak stasioner dalam rataan

\(H_1\) : Data stasioner dalam rataan

Berdasarkan uji ADF tersebut, didapat p-value sebesar \(0.01\) yang lebih kecil dari taraf nyata \(5\%\) sehingga tolak \(H_0\) atau data stasioner dalam rataan. Hal ini sesuai dengan hasil eksplorasi menggunakan plot time series dan plot ACF, sehingga dalam hal ini ketidakstasioneran data sudah berhasil ditangani dan dapat dilanjutkan ke pemodelan.

8.3 Identifikasi Model

8.3.1 Plot ACF

acf(train_nvda.diff)

Berdasarkan plot tersebut, terlihat bahwa plot ACF cenderung cuts off pada lag ke 13.

8.3.2 PACF

pacf(train_nvda.diff)

Berdasarkan plot tersebut, terlihat bahwa plot PACF cenderung cuts off pada lag ke 13 dan 15.

8.3.3 Plot EACF

install_load('TSA')
eacf(train_nvda.diff)
## AR/MA
##   0 1 2 3 4 5 6 7 8 9 10 11 12 13
## 0 o o o o o o x o o o x  o  o  o 
## 1 x o o o o o o o o o o  o  o  o 
## 2 x x o o o o o o o o o  o  o  o 
## 3 x x x o o o o o o o o  o  o  o 
## 4 x x x x o o o o o o o  o  o  o 
## 5 x o x x x o o o o o o  o  o  o 
## 6 x o x x x x o o o o o  o  o  o 
## 7 x o o x x o o o o o o  o  o  o

Identifikasi model menggunakan plot EACF dilakukan dengan melihat titik sudut kiri segitiga pada pola segitiga nol atas (pola mariks segitiga bawah).

Dalam hal ini model tentatif yang terbentuk adalah ARIMA(0,1,1), ARIMA(1,1,1), ARIMA(2,1,2), ARIMA(3,1,3), dst..

8.4 Pendugaan Parameter Model Tentatif

model_tentatif(train_nvda.diff, p_max = 6, d = 1, q_max = 12)
## AR/MA
##   0 1 2 3 4 5 6 7 8 9 10 11 12 13
## 0 o o o o o o x o o o x  o  o  o 
## 1 x o o o o o o o o o o  o  o  o 
## 2 x x o o o o o o o o o  o  o  o 
## 3 x x x o o o o o o o o  o  o  o 
## 4 x x x x o o o o o o o  o  o  o 
## 5 x o x x x o o o o o o  o  o  o 
## 6 x o x x x x o o o o o  o  o  o 
## 7 x o o x x o o o o o o  o  o  o 
## 
## Model ARIMA dengan AIC terkecil:
## Series: data 
## ARIMA(5,1,6) 
## 
## Coefficients:
##           ar1      ar2      ar3      ar4      ar5     ma1      ma2     ma3
##       -1.1978  -0.0409  -0.2389  -1.2334  -0.6608  0.2748  -1.2066  0.1122
## s.e.   0.1100   0.0658   0.0549   0.0660   0.1045  0.0901   0.0516  0.0745
##          ma4      ma5      ma6
##       1.2050  -0.4841  -0.8341
## s.e.  0.0706   0.0578   0.0887
## 
## sigma^2 = 53:  log likelihood = -1066.3
## AIC=2156.61   AICc=2157.65   BIC=2201.56

Berdasarkan pendugaan parameter di atas, nilai AIC terkecil \(1718.04\) dimiliki oleh model ARIMA(5,1,6) dan seluruh parameternya signifikan sehingga model yang dipilih adalah model ARIMA(5,1,6).

model_nvda.da <- Arima(train_nvda.diff, order=c(5,1,6), method="ML")

8.5 Analisis Sisaan

Model terbaik hasil identifikasi kemudian dicek asumsi sisaannya. Sisaan model ARIMA harus memenuhi asumsi normalitas, kebebasan sisaan, dan kehomogenan ragam. Diagnostik model dilakukan secara eksplorasi dan uji formal.

8.5.1 Eksplorasi Sisaan

#Eksplorasi 
sisaan_nvda.da <- model_nvda.da$residuals 
par(mfrow=c(2,2)) 
qqnorm(sisaan_nvda.da) 
qqline(sisaan_nvda.da, col = "blue", lwd = 2) 
plot(c(1:length(sisaan_nvda.da)),sisaan_nvda.da) 
acf(sisaan_nvda.da) 
pacf(sisaan_nvda.da) 

Berdasarkan plot kuantil-kuantil normal, secara eksplorasi ditunjukkan sisaan tidak menyebar normal ditandai dengan titik titik yang cenderung tidak mengikuti garis \(45^{\circ}\). Kemudian dapat dilihat juga lebar pita sisaan yang cenderung sama menandakan bahwa sisaan memiliki ragam yang homogen. Plot ACF dan PACF sisaan ARIMA(5,1,6) juga tidak signifikan pada lag 13 yang menandakan saling bebas. Kondisi ini akan diuji lebih lanjut dengan uji formal.

8.5.2 Uji Formal

8.5.2.1 Sisaan Menyebar Normal

ks.test(sisaan_nvda.da,"pnorm")  #tak tolak H0 > sisaan menyebar normal
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  sisaan_nvda.da
## D = 0.411, p-value < 2.2e-16
## alternative hypothesis: two-sided

Selain dengan eksplorasi, asumsi tersebut dapat diuji menggunakan uji formal. Pada tahapan ini uji formal yang digunakan untuk normalitas adalah uji Kolmogorov-Smirnov (KS). Hipotesis pada uji KS adalah sebagai berikut.

\(H_0\) : Sisaan menyebar normal

\(H_1\) : Sisaan tidak menyebar normal

Berdasarkan uji KS tersebut, didapat p-value sebesar \(2.2e-16\) yang kurang dari taraf nyata \(5\%\) sehingga tolak \(H_0\) dan menandakan bahwa sisaan tidak menyebar normal. Hal ini sesuai dengan hasil eksplorasi menggunakan plot kuantil-kuantil normal.

8.5.2.2 Sisaan saling bebas/tidak ada autokorelasi

Box.test(sisaan_nvda.da, type = "Ljung")  #tak tolak H0 > sisaan saling bebas
## 
##  Box-Ljung test
## 
## data:  sisaan_nvda.da
## X-squared = 0.13993, df = 1, p-value = 0.7083

Selanjutnya akan dilakukan uji formal untuk kebebasan sisaan menggunakan uji Ljung-Box. Hipotesis yang digunakan adalah sebagai berikut.

\(H_0\) : Sisaan saling bebas

\(H_1\) : Sisaan tidak tidak saling bebas

Berdasarkan uji Ljung-Box tersebut, didapat p-value sebesar \(0.7336\) yang lebih besar dari taraf nyata \(5\%\) sehingga tak tolak \(H_0\) dan menandakan bahwa sisaan saling bebas. Hal ini sesuai dengan hasil eksplorasi menggunakan plot ACF dan PACF.

8.5.2.3 Sisaan homogen

Box.test((sisaan_nvda.da)^2, type = "Ljung")  #tak tolak H0 > sisaan homogen
## 
##  Box-Ljung test
## 
## data:  (sisaan_nvda.da)^2
## X-squared = 1.3499, df = 1, p-value = 0.2453

Hipotesis yang digunakan untuk uji kehomogenan ragam adalah sebagai berikut.

\(H_0\) : Ragam sisaan homogen

\(H_1\) : Ragam sisaan tidak homogen

Berdasarkan uji Ljung-Box terhadap sisaan kuadrat tersebut, didapat p-value sebesar \(0.01499\) yang lebih kecil dari taraf nyata \(5\%\) sehingga tolak \(H_0\) dan menandakan bahwa ragam sisaan tidak homogen.

#4) Nilai tengah sisaan sama dengan nol 
t.test(sisaan_nvda.da, mu = 0, conf.level = 0.95)  #tak tolak h0 > nilai tengah sisaan sama dengan 0
## 
##  One Sample t-test
## 
## data:  sisaan_nvda.da
## t = 1.7644, df = 313, p-value = 0.07864
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -0.08159079  1.49862037
## sample estimates:
## mean of x 
## 0.7085148

Terakhir, dengan uji-t, akan dicek apakah nilai tengah sisaan sama dengan nol. Hipotesis yang diujikan sebagai berikut.

\(H_0\) : nilai tengah sisaan sama dengan 0

\(H_1\) : nilai tengah sisaan tidak sama dengan 0

Berdasarkan uji-ttersebut, didapat p-value sebesar \(0.3043\) yang lebih besar dari taraf nyata \(5\%\) sehingga tak tolak \(H_0\) dan menandakan bahwa nilai tengah sisaan sama dengan nol.

8.6 Peramalan

8.6.1 Ramal

Peramalan dilakukan menggunakan fungsi forecast() . Contoh peramalan berikut ini dilakukan untuk 54 hari ke depan.

#---FORECAST---#
ramalan_nvda.da <- forecast::forecast(model_nvda.da, h = 54) 
ramalan_nvda.da
##     Point Forecast      Lo 80     Hi 80     Lo 95    Hi 95
## 316     2.70789750  -6.674755 12.090550 -11.64163 17.05743
## 317    -1.27352810 -10.682780  8.135724 -15.66374 13.11668
## 318     0.11464782  -9.312793  9.542089 -14.30338 14.53267
## 319    -3.71589497 -13.143669  5.711879 -18.13443 10.70264
## 320     1.85893465  -7.623594 11.341464 -12.64334 16.36121
## 321     2.13272241  -7.352067 11.617512 -12.37301 16.63846
## 322     3.41074667  -6.090917 12.912410 -11.12079 17.94229
## 323     4.34391706  -5.157522 13.845356 -10.18728 18.87511
## 324    -1.23592701 -10.764114  8.292260 -15.80803 13.33618
## 325     1.08225611  -8.454997 10.619510 -13.50371 15.66823
## 326    -3.44620444 -13.006749  6.114340 -18.06780 11.17539
## 327     1.22064199  -8.423879 10.865163 -13.52938 15.97066
## 328     1.52751835  -8.117132 11.172169 -13.22270 16.27774
## 329     2.87909180  -6.794978 12.553162 -11.91612 17.67430
## 330     4.18592837  -5.487970 13.859827 -10.60902 18.98088
## 331    -0.27131648  -9.957156  9.414523 -15.08453 14.54190
## 332     1.22858533  -8.460392 10.917562 -13.58943 16.04660
## 333    -2.56754332 -12.271571  7.136485 -17.40857 12.27349
## 334     0.47794166  -9.269297 10.225181 -14.42917 15.38506
## 335     1.26088933  -8.486869 11.008648 -13.64702 16.16880
## 336     2.20099881  -7.565437 11.967434 -12.73548 17.13747
## 337     4.00608838  -5.761906 13.774082 -10.93277 18.94495
## 338     0.37090717  -9.405839 10.147653 -14.58134 15.32315
## 339     1.44836015  -8.331192 11.227912 -13.50817 16.40489
## 340    -1.80157443 -11.593758  7.990609 -16.77743 13.17428
## 341     0.06796294  -9.748350  9.884276 -14.94479 15.08072
## 342     0.99485384  -8.822680 10.812388 -14.01977 16.00948
## 343     1.65796340  -8.172806 11.488733 -13.37690 16.69283
## 344     3.67541603  -6.159873 13.510706 -11.36636 18.71719
## 345     0.85223349  -8.987991 10.692458 -14.19709 15.90156
## 346     1.61415347  -8.228433 11.456740 -13.43878 16.66709
## 347    -1.09529271 -10.947141  8.756556 -16.16239 13.97181
## 348    -0.13309491  -9.997370  9.731180 -15.21920 14.95301
## 349     0.79203581  -9.073947 10.658018 -14.29668 15.88075
## 350     1.21782239  -8.657229 11.092874 -13.88477 16.32041
## 351     3.27828582  -6.603844 13.160416 -11.83513 18.39170
## 352     1.17561689  -8.708801 11.060035 -13.94130 16.29253
## 353     1.73123266  -8.155374 11.617839 -13.38903 16.85149
## 354    -0.47700236 -10.369835  9.415830 -15.60678 14.65278
## 355    -0.17506000 -10.073936  9.723816 -15.31408 14.96396
## 356     0.65261657  -9.248085 10.553318 -14.48920 15.79443
## 357     0.88071130  -9.026110 10.787532 -14.27046 16.03189
## 358     2.85786087  -7.057481 12.773203 -12.30635 18.02207
## 359     1.36946882  -8.546614 11.285552 -13.79587 16.53481
## 360     1.79647266  -8.121755 11.714700 -13.37215 16.96509
## 361     0.04527777  -9.876688  9.967243 -15.12906 15.21961
## 362    -0.10831259 -10.033050  9.816425 -15.28689 15.07026
## 363     0.57445028  -9.351995 10.500895 -14.60674 15.75564
## 364     0.63825698  -9.292245 10.568759 -14.54914 15.82565
## 365     2.44824999  -7.491121 12.387621 -12.75271 17.64921
## 366     1.46122564  -8.478234 11.400686 -13.73987 16.66232
## 367     1.81355502  -8.128081 11.755191 -13.39086 17.01797
## 368     0.46961120  -9.473949 10.413172 -14.73775 15.67697
## 369     0.02622617  -9.918556  9.971008 -15.18301 15.23546

8.6.2 Plot

data.ramalan_nvda.da <- ramalan_nvda.da$mean
plot(ramalan_nvda.da, xlab="Periode (Tahun)", col = "green4", lwd = 2.5)

Berdasarkan hasil plot ramalan di atas, dapat dilihat bahwa ramalan ARIMA(5,1,6) cenderung stabil hingga akhir periode. Selanjutnya, dapat dicari nilai akurasi antara hasil ramalan dengan data uji sebagai berikut.

pt_1 <- train_nvda.ts[length(train_nvda.ts)] #nilai akhir data latih
hasil.forc.Diff <- data.ramalan_nvda.da
hasil <- diffinv(hasil.forc.Diff, differences = 1) + pt_1
#has.1 sama hasilnta dengan: cumsum(c(pt_1,hasil.forc.Diff))
ts.plot(train_nvda.ts,hasil, ylab="Saham Harga (USD)",
        xlab="Periode (Tahun)", 
        col = "green4", lwd = 3.5,
        main="Plot Difference Saham Amazon")

Dapat dilihat bahwa rata-rata harga saham NVIDA diramalkan akan terus Melonjak naik setiap periodenya.

8.6.3 Perbandingan

perbandingan_nvda.da <- matrix(data=c(head(test_nvda.ts, n=54), hasil[-1]),
                     nrow = 54, ncol = 2)
colnames(perbandingan_nvda.da) <- c("Aktual","Hasil Forecast")
datatable(perbandingan_nvda.da, filter = 'top', 
          options = list(pageLength = 5))
akurasi.nvda <- accuracy(ts(hasil[-1]), head(test_nvda.ts, n=54)) %>%
  as.data.frame() %>%
  cbind(Model = ramalan_nvda.da[["method"]]) %>% 
  relocate(Model, .before = 1)
row.names(akurasi.nvda) <- "NVDA"
akurasi.nvda
##             Model       ME     RMSE      MAE      MPE     MAPE      ACF1
## NVDA ARIMA(5,1,6) 21.85129 49.66904 34.48409 4.723584 9.308578 0.9234821
##      Theil's U
## NVDA  3.129117

Didapatkan nilai MAPE sebesar \(9.308578\%\) (kurang dari \(10\%\)) yang menandakan bahwa hasil peramalan dari model ARIMA(5,1,6) sudah sangat baik.

9 Perbandingan Antar Saham

9.1 Perbandingan Akurasi

akurasi <- rbind(akurasi.aapl, akurasi.amzn, akurasi.goog, akurasi.meta,
                 akurasi.msft, akurasi.nflx, akurasi.nvda) %>%
  mutate(Keterangan = case_when(
    MAPE < 10 ~ "Sangat Baik",
    MAPE >= 10 & MAPE <= 20 ~ "Baik",
    MAPE > 20 & MAPE <= 50 ~ "Layak",
    MAPE > 50 ~ "Tidak Akurat"
  )) %>% relocate(Keterangan, .before = 1)

datatable(akurasi, filter = 'top', 
          options = list(pageLength = 5))